上書きしたい領域がファイル(可能な場合)にあります。 私はfseek、fwrite、fsyncを呼び出すと仮定します。このような領域書き換え操作の原子性を保証する方法はありますか?私は確信が必要です。失敗した場合は、古い(修正前の)データか、新しい(変更された)データのみが含まれますが、これは混在しません。アトミックファイルの変更
ハイライトしたいことが2つあります。
まず:アトミック任意のサイズの領域に書き込みをする方法がない場合、それは大丈夫です - 私たちは、ファイルにデータを追加fsync'ing、その後、書き換えファイルの「ポインタ」エリア、再びfsyncingことによってそれを処理することができます。しかし、 'ポインタ'の書き込みがアトミックでない場合でも、不正なポインタでファイルが破損する可能性があります。
第2の:1バイトの領域をアトミックに書いていることは確かです。決してそこに置かないバイトはファイルには表示されません。そこで、アドレス用に2つの領域を割り当てて1バイトのスイッチを使用するトリックを使用することで、新しいデータの追加、同期、2つの(未使用の)ポインタスロットの書き換え、再度同期、もう一度同期してください。したがって、上書き領域操作に少なくとも3回のfsync呼び出しが含まれるようになりました。
私はロングのための原子書記を持っているなら、これはもっと簡単だろうが、本当にそれを持っていますか?
ポイント2で述べたメソッドを使用せずにこの状況を処理する方法はありますか?
もう1つの質問は、書き込みと同期の間に順序保証がありますか? たとえば、fseek、fwrite [1]、fseek、fwrite [2]、fsyncを呼び出すと、[2]で書いたことがありますか?
この質問は、LinuxやWindowsオペレーティングシステムに適用され、任意の特定の回答(たとえば、ubuntuバージョンa.b.c ....など)も必要です。
は[FSYNC](http://linux.die.net/man/3/fsync)かなり実装/ファイルシステムに依存すると思われます。 http://blogs.gnome.org/alexl/2009/03/16/ext4-vs-fsync-my-take/ – zapl
あなたが話していることは、「コミットメント制御」または「コミット/ロールバック」と呼ばれています。または "トランザクション"。 –
(ボックスにいくつかのトランザクション処理機能がなければ、欲しいことを行うための唯一の(ほとんど)完全に信頼できる方法です。古いファイルの交換を行います。古いファイルを新しいファイルにコピーし、新しいファイルを置き換え、古いファイルを新しいファイルに置き換えます。 –