你是如何在两个孩子都是C的情况下通过管道阅读的


int main()
{
int pipefd[2];
char buf;
int pid, pid1;
pid = fork();
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
if(pid == 0){                    // CHILD 1
close(pipefd[1]);
while(read(pipefd[0],&buf,1) > 0){                       // THIS DOESNT WORK
printf("FIRST CHILD WRITES: %sn",&buf);             // THIS DOESNT WORK
}                                                        // THIS DOESNT WORK
close(pipefd[0]);
_exit(EXIT_SUCCESS);
}else{
pid1 = fork();
if(pid1 == 0){                     // CHILD 2
close(pipefd[1]);
// while(read(pipefd[0],&buf,1) > 0){                 // ONLY THIS (WOULD) WORK
//     printf("SECOND CHILD WRITES: %sn",&buf);      // ONLY THIS (WOULD) WORK
// }                                                  // ONLY THIS (WOULD) WORK
close(pipefd[0]);
_exit(EXIT_SUCCESS);
}else{                               // PARENT
close(pipefd[0]);
char* s = "Write To Pipe";
write(pipefd[1],s,strlen(s));
close(pipefd[1]);
wait(NULL);            // WAIT FOR CHILD TO TERMINATE
wait(NULL);            // WAIT FOR CHILD TO TERMINATE
}
}
return 0;
}

每当我尝试运行程序时,只有第2个孩子可以从管道中读取,而第1个孩子永远不会。所以我试着评论第二个孩子的管道阅读,但第一个孩子仍然不能从父母写的管道中阅读。

为什么第一个孩子不能从管道里读出来?

谢谢你的帮助!

订单错误。你的代码是

pid = fork();
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}

你需要在分叉之前创建管道。如果你检查close和/或read上的错误,你可能会发现这种类型的错误。

最新更新