1

書き込み中に電源障害が発生した場合でも、ファイルにアトミックに追加する手段を提供するクラスをC++で書き込もうとしています。

まず、現在のファイル位置(ファイルの先頭から64オフセット、バイト単位)を別のジャーナルファイルに書き込みます。次に、要求されたデータを日付ファイルの最後に書き込みます。最後に、ジャーナルファイルでftruncate()を呼び出します(切り捨てられたサイズを0に設定します)。

主なアイデアは、このクラスが空でないジャーナルファイルを含むファイルを開くように要求された場合、書き込みが中断されたことを認識し、ジャーナルファイルから最後の書き込みの位置を読み取ってその場所にfseekできるということです。最後の部分的な書き込みは失われますが、ファイルが破損してはなりません。

残念ながら、ftruncate()は非同期のようです。実際には、ftruncateの後にfflush()とfsync()を呼び出しても、大量の書き込みを行っている間、ジャーナルが最大数百バイトに成長するのがわかります。最終的には常に0になりますが、常にサイズ0またはサイズ8のいずれかで表示されると予想していました。

ftruncateを完全に同期させることは可能ですか?それとも、ジャーナルを使用するためのより良い方法はありますか?

4

1 に答える 1

7

ftruncate()ファイル内のファイル記述子の書き込みオフセットは変更されません。を呼び出した後、ファイルを開いたままにして次の長さを書き込んでいる場合ftruncate()、何が起こっているのかは、ファイルのオフセットがまだ増加していることです。書き込むと、ファイルの長さがオフセットになるようにリセットされ、そこにバイトが書き込まれます。

おそらくあなたがしたいのは、ファイルへの次の書き込みがファイルの先頭で行われるように、呼び出しlseek(fd, 0, SEEK_SET)た後に呼び出すことです。ftruncate()

于 2012-02-06T01:26:12.673 に答える