假设我们有一个文件FILE_SIZE
字节,并且:
是否有保证ext4
that:
- 这样的写入相对于并发读取来说是原子的吗?
-
此类写入对于系统崩溃而言是事务性的吗?
(即,崩溃后,文件的内容完全来自先前的写入,我们永远不会看到部分写入或空文件)
第二个是否正确:
- with
data=ordered
?
-
with data=journal
或者为单个文件启用日志记录?
(using ioctl(fd, EXT4_IOC_SETFLAGS, EXT4_JOURNAL_DATA_FL)
)
when physical_block_size < FILE_SIZE <= page_size
?
我找到了相关问题 https://stackoverflow.com/questions/10650861/atomicity-of-write2-to-a-local-filesystem哪些链接讨论 http://permalink.gmane.org/gmane.comp.file-systems.ext4/27225从 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
or yyyyyyyyyyyyyyyyxx
.
所以它明确表明写入不是原子的。就我而言,16 字节写入始终是原子的。
答案是:POSIX 不强制要求除管道之外的写入/读取的原子性。我看到的 16 字节原子性是特定于内核的,并且将来可能会发生变化。
实际帖子中的答案详细信息:Linux 中进程之间的 write(2)/read(2) 原子性 https://stackoverflow.com/questions/35595685/write2-read2-atomicity-between-processes-in-linux
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)