2010-02-08 3 views
10

Một câu hỏi đơn giản:Là fwrite nguyên tử?

Tôi cần thêm một số đăng nhập vào chương trình của mình.

Nếu hai quá trình sử dụng "fwrite" trên cùng một tệp nhưng không phải cùng một bộ mô tả tệp thì các bản ghi nhật ký được viết là nguyên tử hoặc hỗn hợp. Có giới hạn độ dài không?

Có phải định nghĩa hành vi ANSI-C hoặc việc triển khai đã được xác định không? Nếu sau này có trên MacOSX, Linux và Windows MSVC thì sao?

+0

Từ kinh nghiệm, các chuỗi nhiệm vụ ưu tiên cao hơn sẽ đặt văn bản ở đâu đó trong văn bản của chuỗi ưu tiên thấp hơn. Điều này có thể được giải quyết bằng cách có một đầu ra nhiệm vụ từ một hàng đợi và một nhiệm vụ khác gắn thêm vào hàng đợi. –

Trả lời

3

Nó có thể được trộn lẫn.

Nếu bạn có nhiều hơn một luồng/quá trình ghi vào cùng một tệp, bạn cần sử dụng khóa.

Cách khác là gửi thông điệp nhật ký đến một dịch vụ/chuỗi chuyên dụng. Một công cụ tuyệt vời để áp dụng là syslog, được cài đặt chắc chắn trên tất cả các bản sao và có thể chạy trên Windows.

14

Sau khi thực hiện một số nghiên cứu và tôi đã tìm thấy những điều sau đây trong link này:

tiêu chuẩn POSIX yêu cầu C stdio FILE * hoạt động là nguyên tử. Thư viện C tuân thủ POSIX (ví dụ: trên Solaris và GNU/Linux) có một đoạn mã nội bộ để hoạt động tuần tự trên FILE * s.

Dường như các cuộc gọi đó phải là nguyên tử, nhưng tùy thuộc vào nền tảng của bạn. Trong cùng một liên kết, đó cũng là một đoạn cho phép bạn thấy các lập trình viên nên chăm sóc:

Vì vậy, ví 3,0, câu hỏi về "là multithreading an toàn cho I/O" phải đã trả lời với, "nền tảng thư viện C của nền tảng của bạn có dành cho I/O không?" Một số là theo mặc định, một số thì không; nhiều đề xuất nhiều triển khai của thư viện C với sự cân bằng khác nhau của an toàn và hiệu quả. Bạn, lập trình viên , luôn được yêu cầu để xử lý nhiều chuỗi.

Ngoài ra, vì bạn có hai khác nhau FILE* trong hai quy trình khác nhau, tôi nghĩ bạn không có lựa chọn nào khác.

+0

Nhưng mỗi quá trình có TẬP_TIN riêng của mình? – Will

+0

@Will: quyền của bạn. Cập nhật, cảm ơn! – yeyeyerman

+1

Cũng trên Windows, 'fwrite' là nguyên tử.[source] (https://msdn.microsoft.com/en-us/library/h9t88zwz.aspx?f=255&MSPPError=-2147217396): * Bởi vì chức năng này khóa chuỗi gọi, nó chỉ an toàn. Đối với phiên bản không khóa, hãy xem _fwrite_nolock. * – rustyx

1

Từ "man flockfile" trên Debian lenny, các hàm stdio là an toàn chỉ.

Có các chức năng stdio không an toàn theo chủ đề, "man unlocked_stdio" để biết thêm chi tiết.

Bạn có thể nhận thêm thông tin từ trang người đàn ông.

-1

fwrite cho studio hình ảnh khóa chuỗi cuộc gọi và do đó an toàn chủ đề