[解決済み] UNIXでファイルの追加はアトミックですか?
質問
一般に、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()
を実装しているだけである可能性もありますし、基礎となるファイルシステムのブロック サイズが原因である可能性もあります。
関連
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Git リポジトリで削除されたファイルを検索して復元する方法
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] Bashでファイルの中身をループする
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] ファイルを作成し、書き込むにはどうすればよいですか?
-
[解決済み] ファイルに行を書き込む正しい方法?
-
[解決済み] 標準入力にタイムスタンプを前置するUnixユーティリティはありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Vimの^M文字とはどういう意味ですか?
-
[解決済み] sedがその場でファイルを編集
-
[解決済み] UNIXにおけるwall-clock-time, user-cpu-time, system-cpu-timeとは具体的にどのようなものですか?
-
[解決済み] 標準入力にタイムスタンプを前置するUnixユーティリティはありますか?
-
[解決済み] コマンドライン Unix ASCII ベースのチャート作成/プロットツール
-
[解決済み] ディレクトリの存在確認と削除を1つのコマンドで行う unix
-
[解決済み] Unixの「ls」による名前順ソート
-
[解決済み] パイプラインでstdoutを強制的にラインバッファリングする
-
[解決済み] 異なる行のファイル名のリストを取得する方法
-
[解決済み] なぜいつも ./configure; make; make install; の3つのステップを別々に行うのですか?