linux - 在 ext4 上覆盖一个小文件是原子的吗?

标签 linux linux-kernel filesystems ext4

假设我们有一个 FILE_SIZE 的文件字节,并且:

  • FILE_SIZE <= min(page_size, physical_block_size) ;
  • 文件大小永远不会改变(即永远不会执行 truncate() 或追加 write());
  • 文件只能通过使用以下方法完全覆盖其内容来修改:

    pwrite(fd, buf, FILE_SIZE, 0);
    

ext4上有保证吗?那:

  1. 对于并发读取,此类写入是原子的?
  2. 对于系统崩溃,此类写入是事务性的?

    (即,崩溃后文件的内容完全来自之前的一些写入,我们永远不会看到部分写入或空文件)

第二个是否为真:

  • data=ordered
  • data=journal或者为单个文件启用日记功能?

    (使用 ioctl(fd, EXT4_IOC_SETFLAGS, EXT4_JOURNAL_DATA_FL) )

  • physical_block_size < FILE_SIZE <= page_size ?


我找到了 related question哪些链接discussion从 2011 年开始。但是:

  • 我没有找到我的问题的明确答案 2 .
  • 我想知道,如果上述内容属实,是否在某处记录

最佳答案

根据我的实验,它不是原子的。

基本上我的实验是有两个进程,一个写入者和一个读取者。写入器循环写入文件,读取器从文件中读取

编写过程:

char buf[][18] = {
    "xxxxxxxxxxxxxxxx",
    "yyyyyyyyyyyyyyyy"
};
i = 0;
while (1) {
   pwrite(fd, buf[i], 18, 0);
   i = (i + 1) % 2;
}

读者进程

while(1) {
    pread(fd, readbuf, 18, 0);
    //check if readbuf is either buf[0] or buf[1]
}

在运行这两个进程一段时间后,我可以看到 readbufxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyxx

因此它明确表明写入不是原子的。在我的例子中,16 字节写入始终是原子的。

答案是:POSIX 不强制写入/读取的原子性,管道除外。我看到的 16 字节原子性是特定于内核的,将来可能/可以改变。

实际帖子中的答案详情: write(2)/read(2) atomicity between processes in linux

关于linux - 在 ext4 上覆盖一个小文件是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32851672/

相关文章:

linux - 覆盖文件内容linux系统调用

objective-c - 苹果操作系统 : how to determine path is file or directory

linux - 文件系统信息如何存储?

linux - cygwin 的 Linux 版本?

linux - 无法在CentOS 7上重新启动apache

linux - 进程的虚拟地址范围

memory - 互斥锁可以代替内存屏障吗

performance - NSDirectoryEnumerator 的 fileAttributes 方法的性能特征是什么?

c++ - 在 Eclipse 环境中使用共享库 (SDSoC)

php - 通过 php 用户在 root 上管理 Linux screen