close()在Linux上调用fsync()吗?

时间:2013-03-11 20:55:54

标签: c linux unix

当我们致电close(<fd>)时,会自动执行fsync()同步到物理媒体吗?

3 个答案:

答案 0 :(得分:10)

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

作为旁注,请务必检查close()的返回值。它将告诉您到目前为止的任何延迟错误。如果您想确保磁盘上的内容,请始终调用fsync()并检查其返回值。

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

答案 1 :(得分:2)

没有

来自man 2 close

  

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

答案 2 :(得分:0)

来自man 2 close

  

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

要回答您的问题,close()不保证fsync()

close仅关闭进程的文件描述符,并删除与该进程关联的所有记录锁。