2011-10-23 49 views
1

如果我有,我想管4个过程:我是否必须为C中的每对进程创建一个新管道?

process1 | process2 | process3 | process4 

做我必须做3米个人的管道喜欢这个

int pipe1[2]; 
int pipe2[2]; 
int pipe3[2]; 

或可我莫名其妙地回收管道的名字,像在这个伪代码:

int pipe1[2];    // we use ONLY two pipe names: pipe1 
int pipe2[2];    //       and pipe2 

pipe(pipe1);    // getting 2 file descriptors here 
pipe(pipe2);    // and 2 here 

for process=1 to 4 
    if (process==3)   // getting 2 new file descriptors for 
    pipe(pipe1);   // process3|process4 (reusing pipe1) 

    fork()     // forking here 
    if (child 1) then 
    use pipe1 
    if (child 2) then 
    use pipe1 
    use pipe2 
    if (child 3) then 
    use pipe2 
    use pipe1    //the pipe1 that we re-pipe()ed 
    if (child 3) then 
    use pipe1    //the pipe1 that we re-pipe()ed 

这项工作?我不知道repipe1 pipe1是否会对使用pipe1的以前的分叉进程产生影响。

回答

1

我过去做过的方式,以及我再次做到这一点的方式,是不重复使用管道,最终使用N-1管道。这也取决于你是否希望有两个以上的进程在同一时间进行通信,如果是这样的话,你显然会在重用2个管道时遇到问题。

0

对于命令中的每个|字符,您需要一个管道,因此需要一个管道调用pipe()

尽管如此,您不需要使用三个单独的int [2]数组来存储管道文件描述符。系统不关心你存储管道文件描述符的变量 - 它们只是int s。

1

简短的回答: 没有,“repiping” PIPE1不会对所使用PIPE1以前派生的进程产生影响,但你最好还是宣布3个管材,管()'荷兰国际集团前叉() ING。

龙答: 要了解原因,让我们先来看看当你创建一个“管道”会发生什么,然后什么,当你“叉”的过程发生。

当调用管(),它 “创建一个管道(一个对象,允许单向 数据流),并分配一对文件描述符的第一描述符连接至管道的读端;所述第二所连接到写作结束。“ (这是来自man pipe页面)

这些文件描述符存储在您传入的int数组中。

当你调用fork(),“新进程(子进程)应调用进程的精确副本”(这是从人fork()的页)

换句话说,父进程将创建一个子进程,并且该子进程将拥有它的自己的数据副本。

所以,当孩子3个电话管(PIPE1),这将创建一个新的管道,并保存新的文件描述符在它的自己的PIPE1变量的副本,而无需修改任何其他进程的PIPE1。

即使你只能声明两个管道变量而只是在子节点3中调用pipe(),它并不是很容易阅读,而其他人(包括你自己)在稍后必须查看你的代码。

有关fork()和pipe()的更多信息,请参阅http://beej.us/guide/bgipc/output/html/multipage/index.html

相关问题