同じファイルに作用する 2 つのプロセスがある場合があります。1 つはライターとして、もう 1 つはリーダーです。ファイルは 1 行のテキスト ファイルで、ライターはループ内でその行を書き直します。リーダーは行を読み取ります。擬似コードは次のようになります。
ライター プロセス
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
) には役立ちません。