ファイルに上書きしたい領域(小さい可能性があります)があります。fseek、fwrite、fsync を呼び出すとします。このような領域書き換え操作の原子性を確保する方法はありますか?これを混ぜます。
強調したいことが2つあります。
最初: 任意のサイズの領域をアトミックに書き込む方法がなくても問題ありません。ファイルにデータを追加し、fsync を実行し、ファイル内の「ポインタ」領域を書き換えてから、再度 fsync を実行することで処理できます。ただし、「ポインタ」の書き込みがアトミックでない場合でも、不正なポインタでファイルが破損する可能性があります。
2番目:1バイト領域の書き込みはアトミックであると確信しています。ファイルに入れたことのないバイトはファイルに表示されません。したがって、アドレスに 2 つの領域を割り当て、1 バイトのスイッチを使用するいくつかのトリックを使用できます。したがって、領域の書き換えは、新しいデータを追加し、同期し、2 つの (未使用の) ポインター スロットの 1 つを書き換え、再度同期し、次に 'switch バイトを書き換えます。 ' そして再び同期します。そのため、領域の上書き操作には、少なくとも 3 つの fsync 呼び出しが含まれるようになりました。
長い間アトミックな書き込みがあれば、これはすべてはるかに簡単になりますが、本当にそれを持っていますか?
ポイント2で述べた方法を使用せずにこの状況を処理する方法はありますか?
もう 1 つの質問は、書き込みと同期の間に順序の保証はありますか? たとえば、fseek、fwrite [1]、fseek、fwrite [2]、fsync を呼び出した場合、[2] での書き込みをコミットし、[1] での書き込みをコミットしないようにすることはできますか?
この質問は、Linux および Windows オペレーティング システムに適用されます。特定の回答 (例: ubuntu バージョン abc ....) も必要です。