1

私が理解しているように、データをストレージデバイスに同期したい場合は、 fsync() を使用して、おそらくすべての OS 出力キャッシュをフラッシュできます...しかし、ドキュメントがあなたをだまそうとするのとは異なり、明らかにこれはまったく保証されません、データがディスクに書き込まれない可能性があります!

これは、データの破損につながる可能性があるため、多くの場合にはあまり適していません。データが(可能な限り)書き込まれたことを保証し、データの破損を防ぐために、POSIXライブラリを(可能であれば移植可能な方法で)使用するにはどうすればよいですか?

fdatasync() はありますが、OSX には実装されていません。より優れた移植性の高い方法がありますか?それとも、異なるシステムに異なるコードを実装する必要がありますか? fdatasync() で十分かどうかもわかりません。

もちろん、最悪のシナリオでは、これを忘れて、ACID を使用する冗長データベース ライブラリを使用してデータを保存することもできます。私はそれをしたくありません。

また、切り捨て操作と名前変更操作が確実に完了したことを確認する方法にも興味があります。

ありがとう!

4

1 に答える 1

6

あなたは同期を探しています。syncと呼ばれるプログラムとsyncと呼ばれるシステムコールの両方があります(man 1 syncそれぞれman 2 sync):

   #include <unistd.h>

   void sync(void);

DESCRIPTION
   sync() first commits inodes to buffers, and then buffers to disk.

したがって、保留中のすべての操作(切り捨て、名前変更など)が実際にディスクに書き込まれるようになります。

fsyncすべての出力キャッシュをフラッシュすることを主張するのではなく、代わりに特定のファイル記述子へのすべての変更をディスクにフラッシュすることを主張します。ディレクトリエントリが更新されることを明示的に保証するものではありません(この場合、ディレクトリのファイル記述子でfsyncを呼び出す必要があります)。

fsyncdataファイルのメタデータをフラッシュせず、代わりにファイル内のデータが確実にフラッシュされるため、さらに役に立ちません。

マンページを信頼することをお勧めします。間違いがないとは言いませんが、非常に正確である傾向があります。

于 2012-11-02T19:37:08.253 に答える