使用標準C IO設備引入了複雜的新層;該文件僅通過write(2)
修改 - 系統調用族(或內存映射,但在本例中未使用) - C標準IO包裝可能會推遲寫入文件一段時間,並且可能不會在一個系統中提交完整的請求呼叫。
的write(2)
調用本身應該表現良好:
[...] 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.
因此您的基礎write(2)
通話將表現正常。
對於更高級別的C標準IO流,您還需要照顧緩衝。 setvbuf(3)
函數可用於請求無緩衝輸出,行緩衝輸出或塊緩衝輸出。從流到流的默認行爲發生變化 - 如果標準輸出和標準錯誤正在寫入終端,則默認情況下它們是行緩衝和無緩衝的。否則,塊緩衝是默認設置。
您可能希望手動選擇行緩衝如果您的數據自然是面向行的,以防止交織的數據。如果你的數據是而不是面向行的,你可能希望使用un-buffered或者讓它進行塊緩衝,但是每當你累積了一個單位的輸出時手動刷新數據。
如果您一次寫入超過BUFSIZ
字節,則寫入操作可能會交錯。 setvbuf(3)
函數可以幫助防止交織。
談論性能可能爲時過早,但行緩衝將比塊緩衝慢。如果您的日誌速度接近磁盤的速度,則可能希望完全採用另一種方法來確保寫入不會交錯。
可能(更好)重複[fopen兩個進程](http://stackoverflow.com/questions/1842909/fopen-two-processes)。 – blahdiblah 2012-03-26 22:45:17
另請參見[多個進程可以附加到文件使用fopen沒有任何併發問題?](http://stackoverflow.com/questions/7552451/can-multiple-processes-append-to-a-file-using-fopen-沒有,任何併發-概率)。 – blahdiblah 2012-03-26 22:47:37
我不知道日誌的使用情況,但我建議看一下'syslog'。也許它適合你。使用它非常簡單。 http://www.gnu.org/software/libc/manual/html_node/Submitting-Syslog-Messages.html – 2012-03-26 22:57:52