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