【发布时间】:2013-02-27 05:03:26
【问题描述】:
当我们调用close(<fd>) 时,它会自动执行fsync() 以同步到物理媒体吗?
【问题讨论】:
当我们调用close(<fd>) 时,它会自动执行fsync() 以同步到物理媒体吗?
【问题讨论】:
它没有。调用 close() 并不能保证内容在磁盘上,因为操作系统可能推迟了写入。
附带说明,请始终检查close() 的返回值。它会让你知道到那时为止的任何延迟错误。如果您想确保内容在磁盘上,请始终调用fsync() 并检查其返回值。
要记住的一件事是后备存储是什么。有些设备可能会进行内部写入延迟,并且在某些情况下可能会丢失内容(尽管较新的存储媒体设备通常具有超级电容器来防止这种情况,或者禁用此功能的方法)。
【讨论】:
fsync() 也不行,原因相同(硬件可能推迟了写入)。
fsync() 强制写入存储,在什么情况下 fsync 不能保证磁盘上的内容(除了奇怪的故障和在某些情况下无法控制的硬件延迟写入)?
fsync() 也无法保证您的数据已到达实际硬件。 close() 的 man page 确实提到了这一点。
fsync,顾名思义,将数据提交到稳定存储。如果不是,那么您的系统不符合 POSIX 标准(即错误)。是的,世界上有许多错误的系统,是的,其中许多系统运行 Linux,但这并不会使这个答案无效,这是完全正确的。
没有。
成功关闭并不能保证数据已被 成功保存到磁盘,因为内核延迟写入。它 文件系统在流关闭时刷新缓冲区并不常见。如果您需要确保数据是 物理存储使用 fsync(2)。 (此时将取决于磁盘硬件。)
【讨论】:
来自man 2 close:
成功关闭并不能保证数据已被 成功保存到磁盘,因为内核延迟写入。它不是 文件系统通常在流被刷新时刷新缓冲区 关闭。如果您需要确保数据是物理存储的,请使用 同步(2)。 (此时将取决于磁盘硬件。)
为回答您的问题,否,close() 不保证fsync()
close 只关闭进程的文件描述符并移除与进程关联的所有记录锁。
【讨论】: