いいえ、fclose()はfsync()を意味しません。多くのLinuxファイルシステムは書き込みを遅らせ、それらをバッチアップするため、全体的なパフォーマンスが向上し、おそらくディスクドライブの消耗が減り、ラップトップのバッテリ寿命が向上します。ファイルが閉じられたときにOSがディスクに書き込む必要がある場合、これらの利点の多くは失われます。
Paul Tomblinは彼の答えで論争を述べ、私が見たことを説明することはコメントに合わないだろう。ここに私が聞いたことがあります:
最近の論争はext4の注文です(ext4は普及しているext3 Linuxファイルシステムの後継です)。 LinuxやUnixシステムでは、古いファイルを読み込み、新しいファイルを別の名前で書き出し、新しいファイル名を古い名前に変更することで、重要なファイルを変更することが一般的です。考え方は、システムがある時点で故障しても、新しいものか古いものかを確実に確認することです。残念なことに、ext4は古いものを読み込み、新しいものを古いものに名前を変更して新しいものを書き込むのがうれしいようですが、システムがステップ2と3の間でダウンすると本当の問題になります。
これに対処する標準的な方法はもちろんfsync()ですが、それはパフォーマンスを破壊します。本当の解決策は、ext3を変更してext3の順序を維持することです。ext3の順序付けは、ファイルの書き出しが完了するまでファイルの名前を変更しません。どうやらこれは標準ではカバーされていないので、実装上の問題であり、ext4のQoIは本当に厄介です。fsync()を常に呼び出すことなく新しいバージョンの設定ファイルを確実に書く方法はなく、両方のバージョンを失う危険性があります。
fsync()が行うべきことをしなかった場合、それはひどいバグです。 – MarkR
、つまりデータベースの耐久性を完全に破壊します。 – MarkR
私が見てきた論争は、コメントに収まらないものです。私はそれに対する答えを書いています。 –