【发布时间】:2016-01-20 21:16:53
【问题描述】:
我正在尝试编写这个小程序,父母和孩子通过管道相互通信,这里的代码有效,除非你“取消注释”注释行,否则会出现某种死锁,我无法弄清楚为什么?有什么想法吗?
int main(int argc, char **argv){
int fd[2];
int fd2[2];
pid_t pid;
pipe(fd);
pipe(fd2);
pid = fork();
if(pid==0){
close(fd[1]);
dup2(fd[0],fileno(stdin));
close(fd2[0]);
FILE *output = fdopen(fd2[1],"w");
char buffer[255];
while(fgets(buffer,255,stdin)!=NULL)
printf("child: %s",buffer);
// fprintf(output,"%s",buffer);
} else {
close(fd[0]);
close(fd2[1]);
FILE *output = fdopen(fd[1],"w");
char buffer[255];
while(fgets(buffer,255,stdin)!=NULL)
fprintf(output,"%s",buffer);
//FILE *input = fdopen(fd2[0],"r");
//while(fgets(buffer,255,input)!=NULL)
// printf("Parent: %s",buffer);
}
return 0;
}
【问题讨论】:
-
你认为应该先终止哪个进程,父进程还是子进程?
-
@DavidSchwartz 孩子。但是如果我等待子进程,那么它又是一个死锁。
-
孩子如何终止?它的
while循环等待它的stdin关闭。父母在哪里关闭它?父级中的close(fd[1])在哪里? -
@DavidSchwartz 它在到达 EOF (ctrl + D) 时终止,然后输出它读取的内容
-
没有 EOF。父级从不执行
close(fd[1]),这将指示文件结束。如果您想向子节点发送 EOF,则父节点需要关闭管道的末端。
标签: c process pipe parent-child