[英]Is overwriting a small file atomic on ext4?
假设我们有一个FILE_SIZE
字节的文件,并且:
FILE_SIZE <= min(page_size, physical_block_size)
; truncate()
或append write()
); 仅通过使用以下方式完全覆盖其内容来修改文件:
\n pwrite(fd,buf,FILE_SIZE,0);\n
在ext4
上保证:
这样的写操作是关于系统崩溃的事务性的吗?
(即,崩溃后文件的内容完全来自某些先前的写入,我们永远不会看到部分写入或空文件)
第二个是真的:
data=ordered
? 使用data=journal
或者为单个文件启用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;
}
读者流程
while(1) {
pread(fd, readbuf, 18, 0);
//check if readbuf is either buf[0] or buf[1]
}
运行两个进程一段时间后,我可以看到readbuf
是xxxxxxxxxxxxxxxxyy
或yyyyyyyyyyyyyyyyxx
。
所以它明确地表明写入不是原子的。 在我的情况下,16byte写入总是原子的。
答案是:除了管道之外,POSIX不要求写入/读取的原子性。 我看到的16字节原子性是内核特定的,将来可能会改变。
实际帖子中的答案细节: 写入(2)/读取(2)linux中进程之间的原子性
我对文件系统的理论很熟悉,而不是Ext4的实现。 以此作为有根据的猜测。
是的,我相信一个扇区的读写将是原子的,因为
不确定一个页面,但在完整的日记模式下,在提交之前将少于一页的内容发送到日志是没有意义的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.