假设我们有一个 FILE_SIZE
的文件字节,并且:
-
FILE_SIZE <= min(page_size, physical_block_size)
; - 文件大小永远不会改变(即永远不会执行
truncate()
或追加write()
); 文件只能通过使用以下方法完全覆盖其内容来修改:
pwrite(fd, buf, FILE_SIZE, 0);
在ext4
上有保证吗?那:
- 对于并发读取,此类写入是原子的?
对于系统崩溃,此类写入是事务性的?
(即,崩溃后文件的内容完全来自之前的一些写入,我们永远不会看到部分写入或空文件)
第二个是否为真:
- 与
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]
}
在运行这两个进程一段时间后,我可以看到 readbuf
是 xxxxxxxxxxxxxxxxyy
或 yyyyyyyyyyyyyyyyyxx
。
因此它明确表明写入不是原子的。在我的例子中,16 字节写入始终是原子的。
答案是:POSIX 不强制写入/读取的原子性,管道除外。我看到的 16 字节原子性是特定于内核的,将来可能/可以改变。
实际帖子中的答案详情: write(2)/read(2) atomicity between processes in linux
关于linux - 在 ext4 上覆盖一个小文件是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32851672/