11

当我们调用close(<fd>)时,它会自动fsync()同步到物理媒体吗?

4

3 回答 3

14

它不是。调用close()不保证内容在磁盘上,因为操作系统可能推迟了写入。

作为旁注,请始终检查close(). 它会让您知道到那时为止的任何延迟错误。如果您想确保内容在磁盘上,请始终调用fsync()并检查其返回值。

要记住的一件事是后备存储是什么。有些设备可能会进行内部写入延迟,并且在某些情况下内容可能会丢失(尽管较新的存储媒体设备通常具有超级电容器来防止这种情况,或者禁用此功能的方法)。

于 2013-03-11T20:57:16.000 回答
2

不。

man 2 close

成功关闭并不能保证数据已成功保存到磁盘,因为内核延迟写入。文件系统在流关闭时刷新缓冲区并不常见。如果您需要确保数据是物理存储的,请使用 fsync(2)。(此时这将取决于磁盘硬件。)

于 2013-03-11T20:59:20.410 回答
1

来自man 2 close

成功关闭并不能保证数据已成功保存到磁盘,因为内核延迟写入。文件系统在流关闭时刷新缓冲区并不常见。如果您需要确保数据是物理存储的,请使用 fsync(2)。(此时这将取决于磁盘硬件。)

回答你的问题,NOclose()不保证fsync()

close只关闭进程的文件描述符并删除与进程关联的任何记录锁。

于 2013-03-11T21:00:46.217 回答