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)
関数を使用して、バッファリングされていない出力、ラインバッファ出力、またはブロックバッファ出力を要求することができます。デフォルトの動作はストリームごとに変化します - 標準出力と標準エラーが端末に書き込んでいる場合、それらはデフォルトでラインバッファリングされ、バッファリングされません。それ以外の場合は、ブロックバッファリングがデフォルトです。
インターリーブされたデータを防ぐために、データが自然に行指向の場合は、手動でラインバッファを選択することをお勧めします。データがでない場合は、ライン指向の場合は、バッファリングされていないバッファを使用するか、ブロックバッファのままにして、出力の単一の単位を蓄積するたびに手動でデータをフラッシュします。
一度にBUFSIZ
バイト以上を書き込むと、書き込みがインターリーブされる可能性があります。 setvbuf(3)
機能は、インターリーブを防止するのに役立ちます。
パフォーマンスについて話すのは時期尚早かもしれませんが、ラインバッファリングはブロックバッファリングよりも遅くなります。ディスクの速度に近い速度でロギングを行っている場合は、書き込みがインターリーブされないようにするために、別のアプローチをとることもできます。
[2つのプロセスを開く]可能な(より良い)複製(http://stackoverflow.com/questions/1842909/fopen-two-processes)。 – blahdiblah
関連項目[複数のプロセスが並行処理の問題を起こさずにfopenを使用してファイルに追加できますか?](http://stackoverflow.com/questions/7552451/can-multiple-processes-append-to-a-file-using-fopen-コンビニエンスなしのprob)。 – blahdiblah
私はあなたのログの使い方のコンテキストを知らないのですが、 'syslog'を見てみることをお勧めします。多分それはあなたに合っています。それを使って作業するのはとても簡単です。 http://www.gnu.org/software/libc/manual/html_node/Submitting-Syslog-Messages.html –