を発行するwrite()
と、データがいくつかのカーネル空間バッファーに移動します。物理層への実際のコミット (「phy-commit」) は、(おそらく) まで延期されます.. (正確には、どのイベントまで?)
close()
ファイル記述子に対してを発行すると、
[...] の場合、開いているファイルの説明に関連付けられているリソースが解放されます
データが含まれていたカーネル バッファを解放 (解放) するということですか? それらのバッファに含まれる貴重なデータはどうなりますか? 失うだろう?
その損失を防ぐには?
経由fsync()
?明示的な phy-commit を要求します。すぐに(同期呼び出し)、または「短時間」だけ延期し、後続の操作、少なくとも破壊的な操作の前にキューに入れたと思います。
しかし、私は即時または緊急のphy-commitを望んでいません。(データを保持し、)後でphy-commitを行うことを忘れないでください。
からman fclose
:
fclose() 関数 [...] は、基になるファイル記述子を閉じます。
...
fclose() は、C ライブラリによって提供されるユーザー空間バッファーのみをフラッシュします。データが物理的にディスクに保存されるようにするには、たとえば sync(2) または fsync(2) を使用して、カーネル バッファーもフラッシュする必要があります。
が先行するfsync
必要はない(またはを含む)ことを示唆している可能性がありますが、後続することはできます (しなければならないことさえあります)。したがって、非常に破壊的ではありません... close
fclose
close
close()