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