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: %s\n",&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: %s\n",&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;
}
每当我尝试运行该程序时,只能从管道读取第二个孩子,而第一个孩子则永远无法读取。因此,我尝试评论第二个孩子的管道读数,但是第一个孩子仍然无法从父级写入的管道中读取。
为什么不能从管道中读取第一个孩子?
谢谢你的帮助!
顺序错误。你的代码是
pid = fork();
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
你需要先创建管道,然后再进行分叉。如果检查close
和和或上的错误,则可能会捕获此类错误read
。
但这证明了为什么最好的方法是始终检查错误,即使在您知道可以使用的功能上也是如此。
不,通过注意到close()失败不会捕获此特定错误。但这是一个好主意,因为这会捕获文件描述符在其他情况下无效的错误。