目录上的 fsync() 是否保证该目录和所有子目录也被刷新?
所以假设我有
foo
|- bar
|- baz
| |--file
如果我写 'file' 然后 fsync on foo 将保证刷新 'file' 的内容(以及 foo 和 baz 的元数据)
目录上的 fsync() 是否保证该目录和所有子目录也被刷新?
所以假设我有
foo
|- bar
|- baz
| |--file
如果我写 'file' 然后 fsync on foo 将保证刷新 'file' 的内容(以及 foo 和 baz 的元数据)
目录上的 fsync() 将刷新该特定目录中的文件名。(例如:如果创建了新文件,则将刷新名称/节点)。不会影响文件的内容,您需要为此在特定文件上调用 fsync()。它不是递归的。
据我所知,fsync()
在目录上根本不能保证做任何事情。Linux 手册页将其定义为所引用文件的刷新缓冲区缓存页;由于目录没有缓冲区缓存页面,它很可能会立即返回。
除非它简单地刷新整个卷,否则它几乎肯定不会刷新目录中包含的文件的缓冲区缓存页面——确定哪些文件递归地存储在引用的目录中可能是一项非常昂贵的操作(例如,在几分钟的范围内小时)如果foo
指向一个大目录树。所以它不会那样做。
如果您想刷新文件而不专门引用它们,请使用sync()
. 它会过于宽泛(通过刷新每个卷上每个文件的缓冲区缓存),但它会完成工作。手册解释:
根据标准规范(例如,POSIX.1-2001),sync() 会安排写入,但可能会在实际写入完成之前返回。但是,从 1.3.20 版开始,Linux 确实在等待。(这仍然不能保证数据的完整性:现代磁盘有很大的缓存。)