Sử dụng các thiết bị IO tiêu chuẩn C giới thiệu một lớp mới của sự phức tạp; tập tin được sửa đổi chỉ qua write(2)
-gia đình các cuộc gọi hệ thống (hoặc ánh xạ bộ nhớ, nhưng không được sử dụng trong trường hợp này) - trình bao bọc tiêu chuẩn IO có thể trì hoãn việc ghi vào tập tin một lúc và không thể gửi yêu cầu hoàn chỉnh trong một hệ thống gọi điện.
Các write(2)
gọi riêng của mình nên cư xử tốt:
[...] If the file was
open(2)ed with O_APPEND, the file offset is first set to the
end of the file before writing. The adjustment of the file
offset and the write operation are performed as an atomic
step.
POSIX requires that a read(2) which can be proved to occur
after a write() has returned returns the new data. Note that
not all file systems are POSIX conforming.
Do đó tiềm ẩn write(2)
cuộc gọi của bạn sẽ cư xử đúng.
Đối với các luồng IO tiêu chuẩn C cao cấp hơn, bạn cũng cần phải chăm sóc bộ đệm. Chức năng setvbuf(3)
có thể được sử dụng để yêu cầu đầu ra không được tạo ra, đầu ra có đầu ra theo đường đệm hoặc đầu ra được chặn theo khối. Thay đổi hành vi mặc định từ luồng này sang luồng khác - nếu đầu ra tiêu chuẩn và lỗi chuẩn được ghi vào thiết bị đầu cuối, thì chúng sẽ được lưu trữ theo dòng và không bị chặn theo mặc định. Nếu không, chặn khối là mặc định.
Bạn có thể muốn chọn theo cách thủ công dòng đệm nếu dữ liệu của bạn được định hướng theo dòng tự nhiên, để ngăn chặn dữ liệu xen kẽ.Nếu dữ liệu của bạn là không phải theo định hướng dòng, bạn có thể muốn sử dụng không được đệm hoặc để khối đệm nhưng tự xóa dữ liệu bất cứ khi nào bạn tích lũy một "đơn vị" đầu ra.
Nếu bạn đang viết nhiều hơn BUFSIZ
byte tại một thời điểm, ghi của bạn có thể bị xen kẽ. Chức năng setvbuf(3)
có thể giúp ngăn chặn sự xen kẽ.
Có thể còn quá sớm để nói về hiệu suất, nhưng việc xếp theo bộ đệm sẽ chậm hơn là chặn khối. Nếu bạn đang đăng nhập gần với tốc độ của đĩa, bạn có thể muốn thực hiện một cách tiếp cận hoàn toàn khác để đảm bảo việc viết của bạn không bị xen kẽ.
Có thể (tốt hơn) trùng lặp của [fopen hai quy trình] (http://stackoverflow.com/questions/1842909/fopen-two-processes). – blahdiblah
Xem thêm [Có thể nhiều quá trình nối thêm vào một tệp bằng fopen mà không có bất kỳ vấn đề tương tranh nào không?] (Http://stackoverflow.com/questions/7552451/can-multiple-processes-append-to-a-file-using-fopen- không-bất kỳ-concurrency-prob). – blahdiblah
Tôi không biết ngữ cảnh sử dụng nhật ký của bạn, nhưng tôi khuyên bạn nên xem 'syslog'. Có lẽ nó phù hợp với bạn. Làm việc với nó thực sự đơn giản. http://www.gnu.org/software/libc/manual/html_node/Submitting-Syslog-Messages.html –