[问题] 两个process写入同一个档案的疑问

楼主: hth9494 (hth9494)   2022-07-09 21:16:42
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux kali 5.18.0-kali2-amd64 #1 SMP PREEMPT_DYNAMIC Debian 5.18.5-1kali1
(2022-06-20) x86_64 GNU/Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc (Debian 11.3.0-3) 11.3.0
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
我有两个process开启同一个file,且两个process同时向file写入字串
一个写入"a",一个写入"b",各自重复写入200次
每一次写入,两个process就会printf出当前ftell的值
问题:
我期待看到file中ab会交替出现
但并没有,而是a全部出现完才换b,或者b出现完才换a
不过从console上印出的ftell值却又显示
这两个process显然是交替执行着,并不是一个执行完才换另一个
既然如此,为什么file的内容不是交替的显示a和b呢
请问要如何做才能看到ab交替的结果
谢谢
喂入的资料(Input):
预期的正确结果(Expected Output):
file中a和b交替显示
错误结果(Wrong Output):
200个a全部显示完才换b,或者200个b显示完才换a
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *pfile;
int id = fork();
if (id == 0) {
char *str = "a";
pfile = fopen("testfile", "a");
if (pfile) {
int i;
for (i = 0; i < 200; i++) {
printf("a = %d\n", ftell(pfile));
fwrite(str, 1, strlen(str), pfile);
}
}
}
else if (id > 0) {
printf("id = %d\n", id);
char *str = "b";
pfile = fopen("testfile", "a");
if (pfile) {
int i;
for (i=0;i<200;i++) {
printf("b = %d\n", ftell(pfile));
fwrite(str, 1, strlen(str), pfile);
}
}
}
fclose(pfile);
return 0;
}
补充说明(Supplement):
作者: Schottky (顺风相送)   2022-07-09 21:30:00
fopen 这一系列的 function 会做 buffering如果你需要 atomic write 可以直接用 write system call或你可以在一开始用 setvbuf(pfile, NULL, _IOFBF, 0);关闭这个 pfile 的 buffering
楼主: hth9494 (hth9494)   2022-07-09 21:52:00
谢谢 我用write就可以了
作者: gusion   2022-07-10 00:44:00
即使write atomic也不能保证ab交替,还是有可能出现连续一些a然后连续一些b,因为process A只知道一直写a,不知道b写入了没,反之亦然,除非process A写入a后通知process B然后等待通知,B写入b后通知A并等待,不断交替
作者: wulouise (在线上!=在电脑前)   2022-07-10 21:20:00
你真的要交替写入的话需要IPC才有办法 IPC cond_var也可
作者: qscgy4 (有点厉害)   2022-07-11 09:36:00
不然你再写一个thread专门接收其他thread写档?

Links booklink

Contact Us: admin [ a t ] ucptt.com