这是原子文件更新的典型且众所周知的方法:
fd = open(“foo.new”, O_WRONLY);
write(fd, buf, bufsize);
fsync(fd);
close(fd);
rename(“foo.new”, “foo”);
一般来说,如果我们还想要持久性(即保证新版本的文件在崩溃时可用),那么我们还需要调用fsync
父目录。
问:UBIFS 也需要这个吗?文档说:
可以为目录调用 fsync() - 它同步目录 inode 元数据。[...]
对目录的 fdatasync() 调用在 UBIFS 中是“无操作”,并且所有更改目录条目的 UBIFS 操作都是同步的。
如果我没看错,后者(“所有更改目录条目的 UBIFS 操作都是同步的”)似乎暗示fsync
不需要调用父目录。然而,我的测试似乎表明并非如此。我是误读了文档,还是这些信息过时了?