Java.io.FileDescriptor.sync()在Linux上是否会对目录执行fsync操作?

5
1个回答

1
fsync手册页面指出,调用fsync并不意味着相关联的目录也会被同步。如果需要,必须为该目录调用fsync
我可以看到这个定义/行为有几个很好的理由:
  1. 用于打开文件的目录可能已经不再为操作系统所知。
  2. 文件与目录之间的关系不是1:1的,所涉及的文件可能通过硬链接被多个目录引用。如果保证对文件进行fsync将同步所有引用目录,则文件系统必须知道所有这些引用的位置。通常,只有从目录到文件的方向是对文件系统已知的。
  3. 如果与文件关联的目录条目已经写入磁盘,则请求文件-fsync时同步目录将毫无意义-这将是一个不必要的性能损失。
现在我们来看看Java的定义/行为。
JavaDoc没有提及与目录相关的文件系统对象。此外,我看不到获取目录的FileDescriptor实例的方法。
看一下基于OpenJDK源代码的实现行为,java.io.FileDescriptor.sync()只是在UNIX上触发fsync,在Windows上触发FlushFileBuffers。因此,不,java.io.FileDescriptor.sync()不会以任何方式影响相关目录。

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