我有一个案例,其中有两个进程作用于同一个文件 - 一个作为编写器,一个作为读取器。该文件是一个单行文本文件,作者在循环中重写该行。读者阅读该行。伪代码如下所示:
作家进程
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
isxxxxxxxxxxxxxxxxyy
或yyyyyyyyyyyyyyyyxx
.
我的理解是,对于最大 512 字节的大小,写入将是原子的。但从我的实验来看,原子性似乎只有 16 个字节。
手册页没有说明普通文件的原子性,它只提到了 512 字节的管道原子性。
我已经用 tmpfs 和 ext4 试过了,结果是一样的。使用O_SYNC
, ext4 写入变得原子化,我理解它,因为写入在到达磁盘之前不会返回,但对 tmpfs ( )O_SYNC
没有帮助。/dev/shm