pipe()从单个父文件到单独的c文件中的多个子进程

时间:2015-03-17 05:48:27

标签: c unix process pipe fork

我有一个使用fork()创建多个子进程的程序。该程序从parent.c的main开始。在分叉之后,父级调用excel来执行child.c。我究竟如何在两个不同程序之间共享管道。我知道我必须在parent.c中为每个子进程创建一个管道,如下所示:

int myPipe[nChildren][2];
int i;

for (i = 0; i < nChildren; i++) {
    if (pipe(myPipe[i]) == -1) {
        perror("pipe error\n");
        exit(1);
    }
    close(pipe[i][0]); // parent does not need to read
}

但是我在child.c中需要做什么?

1 个答案:

答案 0 :(得分:2)

子进程需要将管道FD传递给execl'ed程序。最简单的方法是使用dup2将管道移动到FD 0(stdin)。 例如:

pid = fork();
if (pid == 0) {
  // in child
  dup2(pipe[i][0], 0);
  execl(...);
}

或者,您可以在child.c中使用命令行参数来接受管道的FD编号。例如:

pid = fork();
if (pid == 0) {
  // in child
  sprintf(pipenum, "%d", pipe[i][0]);
  execl("child", "child", pipenum, (char *) NULL);
}

子计划需要使用atoistrtoulargv[1]转换为整数,然后将其用作输入FD。