1. ホーム
  2. unix

[解決済み] UNIXでファイルの追加はアトミックですか?

2022-08-26 08:08:17

質問

一般に、UNIX で複数のプロセスからファイルに追記する場合、何を基準にすればよいのでしょうか。 データを失う可能性はありますか (あるプロセスが他のプロセスの変更を上書きする)? データがぐちゃぐちゃになることはないのか? (例えば、各プロセスがログファイルに対して1回の append で1行ずつ append している場合、2行がつぶれてしまう可能性はありますか?) 追記が上記の意味でアトミックでない場合、相互排除を確実にする最善の方法は何でしょうか?

どのように解決するのですか?

PIPE_BUF' のサイズ以下の書き込みは、アトミックであるべきです。 これは少なくとも 512 バイトであるべきですが、もっと大きくすることも可能です (linux では 4096 に設定されているようです)。

これは、すべての完全に POSIX に準拠したコンポーネントを話していると仮定しています。 たとえば、これは NFS では真実ではありません。

しかし、'O_APPEND' モードで開いたログ ファイルに書き込み、行 (改行を含む) を 'PIPE_BUF' バイト以下に保つと仮定すると、ログ ファイルに複数の書き込みを行うことができ、破損の問題は発生しないはずです。 割り込みは書き込みの前後で発生し、途中では発生しません。 もし、リブートしてもファイルの整合性を保ちたいのであれば、ログファイルへの書き込みの前に fsync(2) を呼び出す必要がありますが、これはパフォーマンスにとって恐ろしいことです。

明確化 : コメントを読んで オズ・ソロモン氏の回答 . 私は、その O_APPEND はその PIPE_BUF サイズの原子性を持っているはずです。Linux がどのように write() を実装しているだけである可能性もありますし、基礎となるファイルシステムのブロック サイズが原因である可能性もあります。