いいえ、一般的にこれを行うのは安全ではありません!
プロセスごとに排他的な書き込みロックを取得する必要があります。これは、1つのプロセスがファイルに書き込んでいる間、他のすべてのプロセスが待機する必要があることを意味します。I/ Oを集中的に使用するプロセスが多いほど、待機時間が長くなります。
プロセスごとに1つの出力ファイルを用意し、それらのファイルを行の先頭にタイムスタンプとプロセスIDを付けてフォーマットして、後でそれらの出力ファイルをオフラインでマージおよびソートできるようにすることをお勧めします。
ヒント:Webサーバーのログファイルのファイル形式を確認してください。これらは行の先頭にタイムスタンプが付いているため、後で組み合わせて並べ替えることができます。
編集
UNIXプロセスは、ファイルを開くときに特定の/固定のバッファサイズ(たとえば、4096バイト)を使用して、ディスク上のファイルとの間でデータを転送します。書き込みバッファがいっぱいになると、プロセスはそれをディスクにフラッシュします。つまり、完全な完全なバッファをディスクに書き込みます。ここで、バッファがいっぱいになったときに発生していることに注意してください。-行末があるときではありません!つまり、行指向のテキストデータをファイルに書き込む単一のプロセスの場合でも、これらの行は通常、バッファがフラッシュされるときに途中で切断されます。最後に、書き込み後にファイルを閉じるときに、ファイルに完全な行が含まれていると見なすことができます。
したがって、プロセスがバッファをフラッシュすることを決定したタイミングに応じて、ファイルへの書き込みは異なります。たとえば、順序は決定論的/予測可能ではありません。バッファがファイルにフラッシュされる場合、完全な行のみを書き込むとは限りません。 -たとえば、通常は部分的な行を書き込むため、複数のプロセスが同期せずにバッファをフラッシュすると、出力が台無しになります。
ウィキペディアでこの記事を確認してください:http://en.wikipedia.org/wiki/File_locking#File_locking_in_UNIX
引用:
Unixオペレーティングシステム(LinuxおよびAppleのMac OS X、Darwinと呼ばれることもあります)は通常、開いているファイルや実行中のプログラムを自動的にロックしません。さまざまな種類のUnixでいくつかの種類のファイルロックメカニズムが利用可能であり、多くのオペレーティングシステムは互換性のために複数の種類をサポートしています。最も一般的な2つのメカニズムは、fcntl(2)とflock(2)です。3番目のそのようなメカニズムはlockf(3)であり、これは別個のものであるか、最初の2つのプリミティブのいずれかを使用して実装される場合があります。
プロセスを同期し、一度に1つだけがファイルに書き込めるようにするために、flockまたはMutexesのいずれかを使用する必要があります。
前に述べたように、プロセスごとに1つの出力ファイルを作成し、後で必要に応じてそれらのファイルを結合する(オフライン)方が、おそらくより速く、より簡単で、より簡単です。このアプローチは、たとえば、複数のスレッドから複数のファイルにログを記録する必要がある一部のWebサーバーで使用されます。また、異なるスレッドがすべて高性能であることを確認する必要があります(たとえば、ファイルで互いに待機する必要はありません)。ロック)。
関連する投稿は次のとおりです:(MarkByerの回答を確認してください!受け入れられた回答は正しくない/関連性がありません。)
>>を使用して、複数の並列プロセスの出力を1つのファイルにパイプするのは安全ですか?
編集2:
コメントで、異なるプロセスから同じファイルに固定サイズのバイナリデータブロックを書き込みたいとおっしゃいました。
ブロックサイズがシステムのファイルバッファサイズとまったく同じである場合にのみ、これは機能します。
固定ブロック長がシステムのファイルバッファサイズと正確に一致していることを確認してください。そうしないと、完了していない行の場合と同じ状況になります。たとえば、16kブロックを使用し、システムが4kブロックを使用する場合、一般に、ファイルには一見ランダムな順序で4kブロックが表示されます。同じプロセスから常に4ブロックが連続して表示される保証はありません。