是否有可能有两个由同一父(LINUX,POSIX)创build的subprocess之间的pipe道

我有多个孩子由同一个父母“分叉”,我尝试构build所有这些subprocess之间的pipe连接,如链接列表结构。 孩子1发送数据到孩子2,孩子2发送到孩子3 ….孩子N发送给孩子1.有没有什么合适的方法来做到这一点?

另外,如果我在进程之间创build和通信,我强制父进程等待所有进程完成他们的工作,因为wait()waitpid()等待第一个完成的进程,但是我需要等待所有进程。 这是另一个问题出现。

谢谢…

Solutions Collecting From Web of "是否有可能有两个由同一父(LINUX,POSIX)创build的subprocess之间的pipe道"

这实际上是一个shell如果建立一个重定向链,即类似的东西

 ls | grep foo | sort | uniq 

在Unix编程中有一些非常好的介绍性文本,其中通过本书实现了一个简单的shell。 而一个shell的任务之一是重定向。 其中一本书是Michael K. Johnson和Erik W. Troan的“Linux Application Programming”。

这本书的主页: http : //ladweb.net/

要为N个流程构建一个重定向链,您需要N-1条管道。 对于每个重定向,使用pipe(int fds[2])系统调用创建一个管道。 在fork()之后,但在执行之前使用dup2(int from, int to)来将管道的末端连接到每个进程的标准输入(0)或标准输出。 这是一个过分简化的代码,没有错误检查:

 int pipe_A[2]; int pipe_B[2]; pipe(pipe_A); pipe(pipe_B); pid_t pid_A, pid_B, pid_C; if( !(pid_A = fork()) ) { dup2(pipe_A[1], 1); /* redirect standard output to pipe_A write end */ execv(...); } if( !(pid_B = fork()) ) { dup2(pipe_A[0], 0); /* redirect standard input to pipe_A read end */ dup2(pipe_B[1], 1); /* redirect standard output to pipe_B write end */ execv(...); } if( !(pid_C = fork()) ) { dup2(pipe_B[0], 0); /* redirect standard input to pipe_B read end */ execv(...); } 

需要注意的是,管道的数组索引被选择的方式反映了标准的输入/输出文件描述符,如果它们用于stdio重定向。 这个选择并不是任意的。

当然,你可以连接管道到任何文件描述符(例如,有一些应用程序,他们的父母打开,说fd 3和4,连接到管道),大多数shell也直接支持(例如1>&3将重定向标准输入fd 3)。 然而, pipe(int fds[2])的数组索引当然是0和1。 我只是这样说的,因为我有一些货运教育程序设计的学生,他们也毫无顾忌地把目标队伍也用于管道系统调度阵列。

等待所有的孩子完成使用waitpid(-1, NULL, 0) – 我认为这是我的预答复的意思,这意味着:等待所有子进程完成。 另一个选择是在一个循环中调用wait() ,这将返回刚刚终止的子节点的pid。 如果再次调用,仍然有一个孩子跑,它会再次阻止。 如果没有孩子,则返回-1。 我更喜欢waitpid解决方案。

首先创建所有管道,然后在FD 0和1中产生具有适当管端的所有子节点。

至于等待,只是继续等待,直到它返回-1。

是的,这相当简单,只需要在父级创建所有管道,并记住关闭子级(ren)中不需要它们的管道/管道末端。

在没有使用管道的儿童中,将管道的FD留在管道中是失败的,因为它可以使其他人永远等待管道的末端。 读者获得EOF之前,所有的作者都必须关闭。