在Linux系统中,close()函数是否会调用fsync()函数?

15
当我们调用close(<fd>)时,它是否会自动执行fsync()以同步到物理介质?
3个回答

18

它并不会。调用close()方法并不保证内容已经写入磁盘,因为操作系统可能已经延迟了写操作。

另外,一定要检查close()的返回值。它会告诉你是否有任何延迟的错误。如果你想确保内容已经写入磁盘,就需要调用fsync()方法,并检查它的返回值。

需要记住的一件事是,要考虑后备存储的类型。有些设备可能会进行内部写延迟,并且在某些情况下可能会丢失内容(尽管较新的存储介质通常具有超级电容器以防止此类情况发生,或者可以禁用此功能)。


fsync()强制将写入存储,除了偶发故障和某些情况下无法控制的硬件延迟写入之外,在什么情况下fsync()不能保证磁盘上的内容? - Jesus Ramos
2
@FrédéricHamidi: fsync,按照定义,将数据提交到稳定存储。如果不这样做,那么你的系统就不符合POSIX标准(即有缺陷)。是的,世界上有很多有缺陷的系统,也有很多运行Linux的系统有缺陷,但这并不否定这个答案,它完全是正确的。 - Nemo
1
@Nemo同意。有些硬件事情是无法控制的,而新的硬件可以推迟写入,并有办法确保即使在故障下数据也能持久化(至少在电源/系统故障时)。 - Jesus Ramos
1
@Nemo,我的第一条评论是在回答中仅有其第一段时发表的。现在情况已经发生了变化,但我同意这个观点是正确的,从未说过反话。 - Frédéric Hamidi
@FrédéricHamidi 是的,这就是为什么我决定更新它以包括某些硬件的详细信息,这些硬件并不保证它。 - Jesus Ramos
显示剩余2条评论

3

编号。

来自man 2 close

成功的关闭并不保证数据已经成功保存到磁盘,因为内核会推迟写操作。当流被关闭时,文件系统通常不会刷新缓冲区。如果你需要确保数据已经物理存储,使用fsync(2)。(这将取决于磁盘硬件在这个点上的情况。)


1

来自man 2 close:

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接