書き込み中にコピーを使用して変更されたファイルを読み取る最良の方法は何ですか?

書き込み中にコピーを使用して変更されたファイルを読み取る最良の方法は何ですか?

常に一貫性が必要なデータを含むファイルがあります。変更が必要な場合は、Process 1新しいファイルを作成し、変更を新しいファイルに書き込んで、を使用してmv新しいファイルの名前を古いファイルの名前に変更します。

Process 2このファイルを読み取る必要がある他のプロセスがある場合、このプロセスが常に一貫したファイルを読み取るようにするにはどうすればよいですか。つまり、読み込みプロセスmv中にProcess 1データ破損を引き起こしていませんか?

ベストアンサー1

以前のファイルと同じファイルシステムに新しいファイルを作成し、rename(2)原子性を保証する関数を使用してこれを保証できます[1]。

Unixファイルシステムでは、rename(2)ディレクトリエントリにのみ作用します。元のディレクトリエントリが指すinodeへのオープンハンドルを持つプロセスは、古いファイルを読み書きし続けます。

通常、このmv(1)ユーティリティはを呼び出しrename(2)ますが、失敗した場合は削除+コピーまたは他の疑わしい非原子的な操作で置き換えることができますrename(2)

同じファイルシステム上の2つのファイルがrename(2)成功を保証しない可能性があります。一部のファイルシステムは9pfs名前変更操作をサポートしていないため、何とか行う必要があります。

[1]より良いことrenameat(2)は、ファイルのデフォルトパスが他のプロセスによって密かに変更されること、つまり「シンボリックリンク攻撃」を防ぐことです。

おすすめ記事