stat(2) 写后读与 write(2) 一致吗?

stat(2) 写后读与 write(2) 一致吗?

man 2 write状态:

POSIX 要求可以证明在 write() 返回之后发生的 read(2) 将返回新数据。请注意,并非所有文件系统都符合 POSIX。

在 Linux 中,对于stat(2)fstat(2),特别是对于成员来说,这也成立吗stat.st_size
具体来说,如果您使用打开一个文件O_CREAT,并成功向其中写入 948427 字节,那么无论是 stat 或 fstat 它,您是否保证会看到st_size948427 的 a ?
(如果是这样,这是 POSIX 文件系统的保证,还是典型 Linux 文件系统在实践中提供的东西,或者是某些文件系统而不是其他文件系统的属性?)

答案1

stat从中检索st_size以及其他信息(元数据)索引节点:

…每个文件都有一个包含该文件元数据的索引节点。应用程序可以使用 stat(2) (或相关调用)检索此元数据,它返回一个 stat 结构......

所以一切都归结为一个问题:成功后何时更新 inode write?有可能 :

同步地write:元数据在返回之前与数据同步提交

  • 每个文件使用O_SYNC标记何时打开- 文件

当 write(2) (或类似)返回时,输出数据和关联的文件元数据已传输到底层硬件

当设置了“S”属性的文件被修改时,更改会同步写入磁盘;这相当于应用于文件子集的“同步”安装选项。

在这些同步更新的情况下,是的,stat在某些更新之后请求write将反映所做的更改。

异步:元数据的提交不是由数据更改触发的,默认情况下......在这种情况下,无论(现代)文件系统如何,连续的统计数据只会反映更改......纯粹的机会......

相关内容