2011-10-23 35 views
5

我的主要过程是分叉两次,从而创建两个孩子。这两个孩子是这样彼此管道:最后一个分叉的孩子不会死亡

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; 
} 
+1

这个问题的标题听起来非常暴力。 – Marlon

+0

@Marlon哈哈直到现在都没有看到它那样! – Pithikos

回答

6

管道的阅读到底会不会得到一个EOF标记直到写入结束被所有用户关闭。两个孩子的父母仍然打开管道的两端,因此more未看到EOF(从read()返回0),并且一直等待更多输入。

+0

谢谢,这是它! – Pithikos

0

检查与ps axw它真的是不会死的more。然后阅读wait的手册页。查看wait的退货状态。

(提示:看是什么原因导致了“僵尸”过程中,我不认为等待在做什么,你认为他们是。)

+0

与“ps aux | grep more”也做到了这一点。我可以看到第二个孩子活着,提示符挂起(等待孩子)。 – Pithikos