C读写多个子进程

时间:2014-06-03 08:55:00

标签: c fork pipe dup2

从C中的父进程,我正在运行3个子节点,每个子节点都执行一个程序。

  • 程序1获取stdin(用户输入)并将其打印到stdout。
  • 程序2获取stdin(应该来自程序1),修改它和 打印到stdout。
  • 程序3获取stdin(应该来自程序2),修改它和 打印到stdout

我正在获取program3的输出,但是没有显示程序2的修改。

以下是来自父母的相关代码:

if((child1 = fork()) < 0){
    /*fatal*/
}
else if(child1 == 0){ //inside child 1
    dup2(pipe1[1], 1); //child 1 uses pipe1[1] for writing
    close(pipe1[0]);

    execl("program1.out", (char *)0);
}
else{
    if((child2 = fork()) <0){
        /*fatal*/
    }
    else if(child2 == 0){ //inside child 2
        close(pipe1[1]);
        dup2(pipe1[0], 0); //child2 uses pipe1[0] for reading
        dup2(pipe2[1], 1); //child2 uses pipe[1] for writing

        execl("program2.out", (char *)0);
    }
    else{
        if((child3 = fork()) <0){
            /*fatal*/
        }
        else if(child3 == 0){ //inside child 3
            close(pipe2[1]);
            close(pipe1[0]);

            execl("program3.out", (char *)0);
        }
        else{ //inside parent
            wait(NULL);
        }
    }   
}

程序正在使用fgets和printf进行读/写。

我已经检查过以前的问题,但我找不到我做错了什么。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

Child3需要做:

dup2(pipe2[0], 0); // child3 uses pipe2[0] for reading

您还需要关闭孩子在每个孩子身上不使用的所有管道。所以child1需要:

close(pipe2[0]);
close(pipe2[1]);

child2需要:

close(pipe2[0]);

和child3需要:

close(pipe1[0]);
close(pipe1[1]);
close(pipe2[1]);

父母需要在分配所有孩子后关闭所有管道。

所有这些关闭都是必需的,以便当管道中的前一个程序关闭管道时,进程将读取EOF,因为管道并非真正关闭,直到所有打开它的进程关闭它。