我有一个使用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中需要做什么?
答案 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);
}
子计划需要使用atoi
或strtoul
将argv[1]
转换为整数,然后将其用作输入FD。