を呼び出すと、物理メディアと同期するためclose(<fd>)
に自動的に実行されますか?fsync()
3 に答える
そうではありません。OSが書き込みを延期した可能性があるため、呼び出しclose()
はコンテンツがディスク上にあることを保証するものではありません。
補足として、常にの戻り値を確認してくださいclose()
。その時点までの延期されたエラーを通知します。また、コンテンツがディスク上にあることを確認したい場合は、常に呼び出しfsync()
てその戻り値も確認してください。
覚えておくべきことの1つは、バッキングストアが何であるかです。内部書き込み遅延を実行する可能性のあるデバイスがあり、場合によってはコンテンツが失われる可能性があります(ただし、新しいストレージメディアデバイスには通常、これを防ぐためのスーパーキャパシタ、またはこの機能を無効にする方法があります)。
いいえ。
カーネルが書き込みを延期するため、クローズが成功しても、データがディスクに正常に保存されたことを保証するものではありません。ストリームが閉じられたときにファイルシステムがバッファをフラッシュすることは一般的ではありません。データが物理的に保存されていることを確認する必要がある場合は、fsync(2)を使用してください。(この時点では、ディスクハードウェアによって異なります。)
差出人man 2 close
:
カーネルが書き込みを延期するため、クローズが成功しても、データがディスクに正常に保存されたことを保証するものではありません。ストリームが閉じられたときにファイルシステムがバッファをフラッシュすることは一般的ではありません。データが物理的に保存されていることを確認する必要がある場合は、fsync(2)を使用してください。(この時点では、ディスクハードウェアによって異なります。)
あなたの質問に答えるために、いいえ、close()
保証しませんfsync()
close
プロセスのファイル記述子のみを閉じ、プロセスに関連付けられているレコードロックをすべて削除します。