gav*_*avv 5 linux filesystems linux-kernel ext4
假设我们有一个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
?
2
。从我的实验来看,它不是原子的。
基本上我的实验是有两个进程,一个作者和一个读者。写入器在循环中写入文件,而读取器从文件中读取
写入流程:
char buf[][18] = {
"xxxxxxxxxxxxxxxx",
"yyyyyyyyyyyyyyyy"
};
i = 0;
while (1) {
pwrite(fd, buf[i], 18, 0);
i = (i + 1) % 2;
}
Run Code Online (Sandbox Code Playgroud)
读者进程
while(1) {
pread(fd, readbuf, 18, 0);
//check if readbuf is either buf[0] or buf[1]
}
Run Code Online (Sandbox Code Playgroud)
运行这两个进程一段时间后,我可以看到readbuf
是xxxxxxxxxxxxxxxxyy
或yyyyyyyyyyyyyyyyxx
。
所以它明确地表明写入不是原子的。在我的情况下,16 字节的写入始终是原子的。
答案是:POSIX 不强制要求除管道外的写/读原子性。我看到的 16 字节原子性是特定于内核的,将来可能/可以更改。
实际帖子中答案的详细信息: write(2)/read(2) atomicity between processes in linux