设想:
任务代码(错误检查省略):
// open, write and close
fd = open(name);
write(fd, buf, len);
close(fd);
< more code here **not** issuing read/writes to name but maybe open()ing it >
// open again and fsync
fd = open(name);
fsync(fd);
Run Code Online (Sandbox Code Playgroud)
name系统中不再有任务同时访问。
它是否已定义,更重要的是,它是否会同步 所引用的 inode 上可能的未完成写入name?即,我会buf在 fsync 之后从文件中读回吗?
来自 POSIX http://pubs.opengroup.org/onlinepubs/009695399/functions/fsync.html我想说这似乎合法......
谢谢。
5 月 18 日编辑:感谢您的回答和研究。我(2016 年)向 extfs 首席开发人员之一(Ted)提出了这个问题,并得到了这样的答案:“Posix 不保证它,但实际上它应该适用于大多数文件系统,包括 ext4。Posix 中的关键词规格为:
该
fsync()函数应请求将由命名的打开文件描述符的fildes所有数据传输到与 所描述的文件关联的存储设备fildes。
它没有说“...描述的文件的所有数据fildes”,而是说“打开的文件描述符的所有数据”。因此从技术上讲,不能保证由另一个文件描述符写入的数据会同步到磁盘。
实际上,文件系统不会尝试通过 fd 进入的脏数据,因此您无需担心。编写的内容超过严格要求的操作系统是符合标准的,因此您通常会发现这一点,即使它没有得到保证。”这比“完全相同的持久保证”不太具体,但相当权威,尽管可能已经过时了。
我想做的是一个适用于单个文件的“同步”命令。就像 …