fsync() 的调用可确保在同一文件描述符上对 write() 的任何已完成调用所写的数据是持久的,即使系统随后崩溃并重新启动它们也是可读的 .

情况也是这样, write() 调用的效果可能会在他们去磁盘的路上被重新排序,所以如果你没有 fsync() ,那么你可能会看到后来调用 write() 而不是之前调用的效果 .

据我了解,即使在 fsync() 调用之间,附加到文件似乎也相当安全:在崩溃之后,生成的文件是 fsync() ed加上可能是其他任何其他内容的初始子序列 . 该文件不可能包含以后的写入而不是更早的写入,或者包含垃圾数据而不是实际写入的内容(可能取决于您选择的文件系统,例如 ext3ext4 具有 data=ordered vs data=writeback ) .

更不清楚的是在覆盖文件中间的某些块时崩溃的影响 . 在这种情况下,在崩溃后读取文件时是否可能会看到任何块子集被覆盖?如果是这样,实际上是否有任何方法可以安全地更新文件的中间部分,或者您基本上是否必须依赖仅附加日志来获得持久性?

有关 write() 呼叫在 fsync() 呼叫时正在进行的呼叫,或者之后启动的保证是否有任何保证?我将在哪里找到这些保证的权威来源?