我有两次主要过程,因此创造了两个孩子。这两个孩子互相用管道输送:
ls | more
现在问题是第二个孩子永远不会死。这是为什么?管道中的最后一个孩子什么时候真的死了?
删除一个 wait()调用会显示ls | more
的预期结果,但会产生一些奇怪的行为(卡住终端等)。
这是我的代码:
int main(){
printf("[%d] main\n", getpid());
int pip[2], i;
pipe(pip);
/* CHILDREN*/
for (i=0; i<2; i++){
if (fork()==0){
/* First child */
if (i==0){
printf("[%d] child1\n", getpid());
close(1); dup(pip[1]);
close(pip[0]);
execlp("ls", "ls", NULL);}
/* Second child */
if (i==1){
printf("[%d] child2\n", getpid());
close(0); dup(pip[0]);
close(pip[1]);
execlp("more", "more", NULL);}
}
}
wait(NULL); // wait for first child
wait(NULL); // wait for second child
return 0;
}
答案 0 :(得分:7)
在所有用户关闭写入结束之前,管道的读取端将不会获得EOF标记。两个孩子的父母仍然打开管道的两端,因此more
没有看到EOF(从read()
返回0),并且一直等待更多输入。
答案 1 :(得分:0)
与ps axw
核实,确实more
确实没有死亡。然后阅读wait的手册页。查看wait
的返回状态。
(提示:看看导致“僵尸”过程的原因。我不认为等待是按照你认为的那样做的。)