質問: `hoge` という文字列をファイルに書き出すプログラムを書いているとします。このプログラムのプロセスが、任意のタイミングで kill シグナルによって殺されうるとしたとき、このファイル書き込み処理をアトミックに行うことはできますか? 具体例としては、コミットログを作成するプログラムなどを想定しています。 もし、ファイルシステムが重要ならば、 ext4 を想定したいです。
回答: ナイーブには 1. テンポラリファイルを作成(&オープン)する。 2. オープンしたままunlinkする。ファイルディスクリプタはまだ握っているのでファイルの操作は可能。 3. 書き込む。 4. syncする。 5. ここまででプロセスが死んだりしても半端な内容のファイルはディスクに残らない。 6. 本来の名前にリネーム(link)。この処理自体はアトミックであることを期待。ディスクをまたがったコピーなどは行なわれない前提。 くらいが限度かな、と思いました。 sync発行しただけではたとえばディスク側で持っているキャッシュから向こう側で永続化されている保証は得られないとか言い出すとキリがないですが。