2013-03-11 24 views

答えて

9

これはありません。 close()を呼び出すと、OSが書き込みを延期している可能性があるため、内容がディスク上にあることを保証するものではありません。

補足として、常に戻り値close()を確認してください。その時点までの遅延エラーをお知らせします。また、内容がディスク上にあることを確認したい場合は、常にfsync()と呼び出して、その戻り値も確認してください。

覚えておくべきことの1つは、バッキングストアです。内部書き込み遅延を起こす可能性のあるデバイスが存在し、場合によってはコンテンツが失われる可能性があります(新しいストレージメディアデバイスでは通常、これを防止するためのスーパーキャパシタやこの機能を無効にする方法があります)。成功したクローズは、カーネルが書き込みを延期などのデータが 成功し、ディスクに保存されていることを保証するものではありません

+0

同じ理由で 'fsync()' *を呼び出すことは*ではありません(ハードウェアが書き込みを延期した可能性があります)。 –

+0

@FrédéricHamidi 'fsync()'は、fsyncがどのような条件でディスク上の内容を保証しないのかを記憶域に強制的に書き込みます(場合によっては制御できない奇妙な失敗やハードウェアの遅延書き込みを除く)? –

+0

ディスクコントローラ内に別のキャッシュ層があるかもしれないので、 'fsync()'でさえ、あなたのデータが実際のハードウェアにそれを行ったことを保証できません。 'close()'の[man page](http://linux.die.net/man/2/close)はこれについて言及しています。 –

1

man 2 close

から。ストリームが閉じられたときにファイルシステムがバッファをフラッシュするのは一般的ではありません。 データが 物理的に格納されていることを確認する必要がある場合は、fsync(2)を使用します。 (これは、この時点では、ディスクのハードウェアに依存します。)

0

man 2 closeから:

成功に近いが、カーネルは書き込みを延期などのデータが 成功し、ディスクに保存されていることを保証するものではありません。ストリームが が閉じられたときに、バッファをフラッシュするファイルシステムに共通のものは ではありません。データが物理的に格納されていることを確認する必要がある場合は、 fsync(2)を使用してください。 (これは、この時点では、ディスクのハードウェアに依存します。)

は、あなたの質問に答えるために、NOclose()fsync()

closeが唯一のプロセスや削除しのためのファイルディスクリプタをクローズ保証するものではありません。プロセスに関連付けられたレコードロック。

関連する問題