fsync
への呼び出しの前にへの呼び出しを発行しfstat
て、ターゲット ファイルのファイルサイズを決定するレガシー コードがあります。(具体的には、コードは stat 構造体から st_size にのみアクセスしています。)
ドキュメントを見て、これは必要な電話だとは思いませんが、専門家の意見が欲しかったのです。
fsync
への呼び出しの前にへの呼び出しを発行しfstat
て、ターゲット ファイルのファイルサイズを決定するレガシー コードがあります。(具体的には、コードは stat 構造体から st_size にのみアクセスしています。)
ドキュメントを見て、これは必要な電話だとは思いませんが、専門家の意見が欲しかったのです。
正しく実装されたファイルシステムでは、fsync
orへの呼び出しを発行しても、fdatasync
後続の // 呼び出しの結果に影響を与えるべきではありませstat
ん。その唯一の効果は、フラッシュされていない書き込みと、の場合は変更されたメタデータが永続的なストレージにコミットされることです。そして、そのバリアントは、実際のデータが永続的なストレージに作成されたかどうかに関係なく、キャッシュされた書き込みで問題なく動作します。fstat
lstat
fsync
stat
とはいえ、あなたが勉強しているコードで が必要かどうかfstat
はセマンティクスの問題であり、 の結果がどのようにfstat
使用されるかに依存します。例えば:
fsync
で現在のメタデータを取得できるようにするために呼び出す必要があるという誤解のために使用されている場合はstat
、おそらく削除できます。
たとえば、ある種のチェックポイントデータを書き込むために使用される場合、呼び出し順序を逆にする必要があるかもしれませんが、まったく無関係ではありません。を呼び出してから* を呼び出してから、チェックポイント情報を書き込むのが理fstat
にかなっています。fsync
I/O バウンド操作の何らかの UI 進行状況モニターとして使用する場合、実際にディスクにコミットされたデータの量を表示するのが理にかなっている場合があります。ただし、その場合、モニターの精度は重要ではないため、呼び出し順序はそれほど重要ではありません。
では、あなたのケースで使用された結果はどうですか?fstat
免責事項:ファイルシステムの実装が存在する可能性があります。たとえば、呼び出しfsync
によってファイルのローカル クライアント メタデータ キャッシュが更新される可能性がある、ネットワーク化された/分散型の実装です。その場合、そのfsync
呼び出しは実際にコードの信頼性を向上させる可能性があります。ただし、その場合は、パフォーマンスの問題よりも深刻な問題が発生している可能性があります...