2016-01-06 26 views
-1

他是交易: 我有n fork,在叉我有exec,一切都连接pipe
我的问题:
如果有些孩子做exit()我想close他的pipe能够阅读。 - 这个怎么做? waitpid函数最有可能的......选择,pipie和waitpd - 如何等待specyfic的孩子?

现在我等一样,所有子:

for(i = 0; i< val; i++) 
     { 
       wait(&status); 
       close(fd[i][1]); 
     } 

val - 一个孩子的数量。

+0

这个问题不太清楚。如果你想在child(ren)退出时关闭一些通过管道建立的连接,那么1)忽略SIGPIPE(这样你的父/服务器不会退出 - SIGPIPE的默认操作是退出)2)查找EPIPE错误号。 3)关闭返回'EPIPE'的文件描述符。除了收获的目的,你不需要使用wait()来达到这个目的。 –

回答

1

当你分岔时,父母接收孩子的PID。 您需要将这些pid保留在某些数据结构中(可能是哈希表或链接列表)。您还应该保留与该pid关联的pipe-fd。因此,或许像一个数据结构:

typedef struct pidsnpipes pidsnpipes; 
struct pidsnpipes { 
    pidsnpipes * next;  /* for linked list */ 
    pid_t  childpid; 
    int   pipefd;  /* parents end of this pipe */ 
    int   status;  /* if you want to remember the child's exit status */ 
}; 

pidsnpipes * childprocs = NULL; 

wait()回报你得到它退出(和可选,它的退出状态)的子进程的PID。使用它来查找哪个管道与该进程一起运行,以便关闭正确的管道。