从C中的父进程,我正在运行3个子节点,每个子节点都执行一个程序。
我正在获取program3的输出,但是没有显示程序2的修改。
以下是来自父母的相关代码:
if((child1 = fork()) < 0){
/*fatal*/
}
else if(child1 == 0){ //inside child 1
dup2(pipe1[1], 1); //child 1 uses pipe1[1] for writing
close(pipe1[0]);
execl("program1.out", (char *)0);
}
else{
if((child2 = fork()) <0){
/*fatal*/
}
else if(child2 == 0){ //inside child 2
close(pipe1[1]);
dup2(pipe1[0], 0); //child2 uses pipe1[0] for reading
dup2(pipe2[1], 1); //child2 uses pipe[1] for writing
execl("program2.out", (char *)0);
}
else{
if((child3 = fork()) <0){
/*fatal*/
}
else if(child3 == 0){ //inside child 3
close(pipe2[1]);
close(pipe1[0]);
execl("program3.out", (char *)0);
}
else{ //inside parent
wait(NULL);
}
}
}
程序正在使用fgets和printf进行读/写。
我已经检查过以前的问题,但我找不到我做错了什么。有什么想法吗?
答案 0 :(得分:1)
Child3需要做:
dup2(pipe2[0], 0); // child3 uses pipe2[0] for reading
您还需要关闭孩子在每个孩子身上不使用的所有管道。所以child1需要:
close(pipe2[0]);
close(pipe2[1]);
child2需要:
close(pipe2[0]);
和child3需要:
close(pipe1[0]);
close(pipe1[1]);
close(pipe2[1]);
父母需要在分配所有孩子后关闭所有管道。
所有这些关闭都是必需的,以便当管道中的前一个程序关闭管道时,进程将读取EOF
,因为管道并非真正关闭,直到所有打开它的进程关闭它。