当我们调用
close(<fd>)
时,它是否会自动执行fsync()
以同步到物理介质?它并不会。调用close()
方法并不保证内容已经写入磁盘,因为操作系统可能已经延迟了写操作。
另外,一定要检查close()
的返回值。它会告诉你是否有任何延迟的错误。如果你想确保内容已经写入磁盘,就需要调用fsync()
方法,并检查它的返回值。
需要记住的一件事是,要考虑后备存储的类型。有些设备可能会进行内部写延迟,并且在某些情况下可能会丢失内容(尽管较新的存储介质通常具有超级电容器以防止此类情况发生,或者可以禁用此功能)。
编号。
成功的关闭并不保证数据已经成功保存到磁盘,因为内核会推迟写操作。当流被关闭时,文件系统通常不会刷新缓冲区。如果你需要确保数据已经物理存储,使用fsync(2)。(这将取决于磁盘硬件在这个点上的情况。)
来自man 2 close
:
成功关闭并不保证数据已经成功保存到磁盘上,因为内核会延迟写入。当流关闭时,文件系统通常不会刷新缓冲区。如果你需要确保数据被物理存储,请使用fsync(2)。(这将取决于硬件磁盘)
回答您的问题,不,close()
不能保证fsync()
close
只关闭进程的文件描述符并删除与该进程相关的任何记录锁。
fsync()
强制将写入存储,除了偶发故障和某些情况下无法控制的硬件延迟写入之外,在什么情况下fsync()
不能保证磁盘上的内容? - Jesus Ramosfsync
,按照定义,将数据提交到稳定存储。如果不这样做,那么你的系统就不符合POSIX标准(即有缺陷)。是的,世界上有很多有缺陷的系统,也有很多运行Linux的系统有缺陷,但这并不否定这个答案,它完全是正确的。 - Nemo