当我们调用close(<fd>)
时,它会自动fsync()
同步到物理媒体吗?
问问题
6199 次
3 回答
14
它不是。调用close()
不保证内容在磁盘上,因为操作系统可能推迟了写入。
作为旁注,请始终检查close()
. 它会让您知道到那时为止的任何延迟错误。如果您想确保内容在磁盘上,请始终调用fsync()
并检查其返回值。
要记住的一件事是后备存储是什么。有些设备可能会进行内部写入延迟,并且在某些情况下内容可能会丢失(尽管较新的存储媒体设备通常具有超级电容器来防止这种情况,或者禁用此功能的方法)。
于 2013-03-11T20:57:16.000 回答
2
不。
成功关闭并不能保证数据已成功保存到磁盘,因为内核延迟写入。文件系统在流关闭时刷新缓冲区并不常见。如果您需要确保数据是物理存储的,请使用 fsync(2)。(此时这将取决于磁盘硬件。)
于 2013-03-11T20:59:20.410 回答
1
来自man 2 close
:
成功关闭并不能保证数据已成功保存到磁盘,因为内核延迟写入。文件系统在流关闭时刷新缓冲区并不常见。如果您需要确保数据是物理存储的,请使用 fsync(2)。(此时这将取决于磁盘硬件。)
回答你的问题,NO,close()
不保证fsync()
close
只关闭进程的文件描述符并删除与进程关联的任何记录锁。
于 2013-03-11T21:00:46.217 回答