http://pubs.opengroup.org/onlinepubs/9699919799/toc.htm (Single UNIX Specification, Version 4, 2010 Edition)からの引用:
このボリュームの POSIX.1-2008 では、複数のプロセスからファイルへの同時書き込みの動作は指定されていません。アプリケーションでは、なんらかの形式の同時実行制御を使用する必要があります。
仕様では、複数のリーダーの場合に書き込みに関する書き込みのセマンティクスがどのように発生するかについて説明していますが、上記からわかるように、複数の同時書き込みの動作は仕様では定義されていません。
上記のメモはfilesについて説明しています。パイプと FIFO の場合、PIPE_MAX セマンティクスが適用され、同時書き込みは PIPE_MAX バイトまで割り切れないことが保証されます。
パイプまたは FIFO への書き込み要求は、次の例外を除いて、通常のファイルと同じ方法で処理されます。
{PIPE_BUF} バイト以下の書き込み要求は、同じパイプで書き込みを行う他のプロセスからのデータとインターリーブされません。{PIPE_BUF} バイトを超える書き込みは、ファイル ステータス フラグの O_NONBLOCK フラグが設定されているかどうかに関係なく、他のプロセスによる書き込みと任意の境界でデータをインターリーブすることができます。
実際のファイル システムの場合、状況は複雑です。一部のローカル ファイル システムは、書き込み中にファイル ハンドルをロックすることにより、任意のサイズ (メモリ制限) までアトミックな書き込みを強制する場合があります。 /linux+v3.5.3/fs/jbd2/transaction.c#L147 )。
非ローカル ファイル システムの場合、結果は多かれ少なかれグラブになります。なんらかの形式の明示的なロックなしで、ネットワーク化されたファイル システムで同時書き込みを試みないでください (または、使用しているネットワーク ファイル システムのセマンティクスについて完全に確信している場合)。
ところで、O_APPEND は、異なるプロセスによるすべての書き込みがファイルの最後に行くことを保証します。ただし、上記の SUS が指摘しているように、書き込みが実際に同時実行される (同時に発生する) 場合、動作は未定義です。以前のユニプロセスおよびプリエンプティブでない UNIX では、これは実際には問題ではありませんでした。他の誰かが書き込む機会を得る前に write(2) の呼び出しが完了していたからです...
この質問は、オペレーティング システム (Linux?) とファイル システム (ext4?)の特定の組み合わせについて明確に答えることができます。一般的な答えは?SUSが読むように-「未定義の動作」。