作者hth9494 (掰掰惹 仙度瑞拉)
看板C_and_CPP
标题[问题] 两个process写入同一个档案的疑问
时间Sat Jul 9 21:16:42 2022
开发平台(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):
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 125.229.74.160 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1657372608.A.F32.html
1F:推 Schottky: fopen 这一系列的 function 会做 buffering 07/09 21:30
2F:→ Schottky: 如果你需要 atomic write 可以直接用 write system call 07/09 21:30
3F:→ Schottky: 或你可以在一开始用 setvbuf(pfile, NULL, _IOFBF, 0); 07/09 21:32
4F:→ Schottky: 关闭这个 pfile 的 buffering 07/09 21:33
5F:→ hth9494: 谢谢 我用write就可以了 07/09 21:52
6F:推 gusion: 即使write atomic也不能保证ab交替,还是有可能出现连续一 07/10 00:44
7F:→ gusion: 些a然後连续一些b,因为process A只知道一直写a,不知道b 07/10 00:44
8F:→ gusion: 写入了没,反之亦然,除非process A写入a後通知process B 07/10 00:44
9F:→ gusion: 然後等待通知,B写入b後通知A并等待,不断交替 07/10 00:44
10F:推 wulouise: 你真的要交替写入的话需要IPC才有办法 IPC cond_var也可 07/10 21:20
11F:推 qscgy4: 不然你再写一个thread专门接收其他thread写档? 07/11 09:36