man 2 write
状态:
POSIX 要求可以证明在 write() 返回之后发生的 read(2) 将返回新数据。请注意,并非所有文件系统都符合 POSIX。
在 Linux 中,对于stat(2)
和fstat(2)
,特别是对于成员来说,这也成立吗stat.st_size
?
具体来说,如果您使用打开一个文件O_CREAT
,并成功向其中写入 948427 字节,那么无论是 stat 或 fstat 它,您是否保证会看到st_size
948427 的 a ?
(如果是这样,这是 POSIX 文件系统的保证,还是典型 Linux 文件系统在实践中提供的东西,或者是某些文件系统而不是其他文件系统的属性?)
答案1
stat
从中检索st_size
以及其他信息(元数据)索引节点:
…每个文件都有一个包含该文件元数据的索引节点。应用程序可以使用 stat(2) (或相关调用)检索此元数据,它返回一个 stat 结构......
所以一切都归结为一个问题:成功后何时更新 inode write
?有可能 :
同步地write
:元数据在返回之前与数据同步提交
- 每个文件使用O_SYNC标记何时打开- 文件
当 write(2) (或类似)返回时,输出数据和关联的文件元数据已传输到底层硬件
每个文件系统:(仅支持 ext2、ext3、fat、vfat 和 ufs)添加同步选项山(或在
/etc/fstab
)每个文件和仅适用于 ext2 底层文件系统通过设置S属性文件的
chattr +S
当设置了“S”属性的文件被修改时,更改会同步写入磁盘;这相当于应用于文件子集的“同步”安装选项。
在这些同步更新的情况下,是的,stat
在某些更新之后请求write
将反映所做的更改。
异步:元数据的提交不是由数据更改触发的,默认情况下......在这种情况下,无论(现代)文件系统如何,连续的统计数据只会反映更改......纯粹的机会......