我想在进程A中编写一些内容并在进程B中读取它,该进程是由A分叉的。但是我发现除非A终止,否则B无法读取内容。如果在没有退出的情况下在B中读取,我如何在进程A中编写?我的代码如下。
#include <stdio.h>
#include <unistd.h>
int mypipe[2];
int main(){
FILE* f;
pid_t pid = 0;
int num = 0, temp;
pipe(mypipe);
pid = fork();
if (pid == (pid_t)0){
f = fdopen(mypipe[0], "r");
while (1){
fscanf(f, "%d", &temp);
printf("from child: %d\n", temp);
}
fclose(f);
}
else{
f = fdopen(mypipe[1], "w");
while (1){
scanf("%d", &num);
fprintf(f, "%d\n", num);
//break;
}
fclose(f);
}
return 0;
}
答案 0 :(得分:2)
除非A终止,否则B无法读取内容
这是因为A实际上没有写东西。 stdio
个流(由FILE *
表示)被缓冲。您可以使用setvbuf()
设置缓冲模式。默认情况下,使用fdopen()
在管道上打开的流将完全缓冲,因此在缓冲区已满之前不会对管道进行实际写入。
最简单的解决方案是在您希望写入的任何地方调用代码fflush()
,例如:在fprintf()
:
while (1){
scanf("%d", &num);
fprintf(f, "%d\n", num);
fflush(f);
//break;
}
答案 1 :(得分:0)
首先,代码中有许多不必要的行。您可以直接使用read()和write()系统调用,而不是执行fdopen()。其次fork()系统调用返回0到子进程并将子进程的pid返回给父进程。最后,父母应该等待孩子完成并从记忆中清除它以阻止它变成僵尸。
这是您的代码的更正版本可以完美无损地运行。
viewBox
阅读系统调用手册页 男人2读,男人2写等。