我可以帮您翻译成中文。以下是需要翻译的内容:
读取过程
在运行这两个进程一段时间后,我发现
我的理解是,对于512字节及以下的大小,写操作应该是原子性的。但从我的实验来看,似乎只有16字节是原子性的。
man手册没有关于普通文件原子性的说明,它仅提到了管道512字节的原子性。
我已经尝试过tmpfs和ext4,结果相同。使用
我有一个案例,其中有两个进程同时作用于同一个文件 - 一个作为写入者,另一个作为读取者。该文件是一个单行文本文件,写入者在循环中重新编写该行。读取者读取该行。伪代码如下:
写入者进程
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
。我的理解是,对于512字节及以下的大小,写操作应该是原子性的。但从我的实验来看,似乎只有16字节是原子性的。
man手册没有关于普通文件原子性的说明,它仅提到了管道512字节的原子性。
我已经尝试过tmpfs和ext4,结果相同。使用
O_SYNC
,ext4写入变得原子化,我理解这是因为写入直到命中磁盘才返回,但O_SYNC
对于tmpfs(/dev/shm
)没有帮助。