将管道连接到子进程
Posted
技术标签:
【中文标题】将管道连接到子进程【英文标题】:Connecting Pipes to child processes 【发布时间】:2017-09-24 13:04:16 【问题描述】:我正在处理一项需要我创建一个 shell 的任务。我需要在自己的进程中运行大多数命令。但是,当我需要在所有子进程之间实现管道时,就会出现困难。
据我目前了解的是,我应该在父进程中创建所有管道,然后将管道复制到 STDIN/STDOUT。所以我做了一个函数,为每个命令创建一个新管道,如下所示:
int count = 2 * amountOfCommands
int fd[count];
for (int i = 0; i < count; i++)
pipe(fd); //I have error checking, but I left it out here.
假设我们要为此示例创建管道:
shell $> cat file.txt | grep '模式1' | grep '模式2' | wc -l
这意味着我们将创建 4 个管道,因此计数为 8。但我不确定复制部分是否会像这样结束:
这里我假设0是STDIN_FILENO,1是STDOUT_FILNO,2是STDERR
cat file.txt
0: STDIN
1: fd[1] //WRITE
grep 'pattern1'
0: fd[0] //READ from cat
1: fd[3] //WRITE
grep 'pattern2'
0: fd[2] //READ from grep
1: fd[5] //WRITE
wc -l
0: fd[4] //READ from grep
1: STDOUT
如果是,我应该如何处理其余的管道?我创建了 4,所以应该有 4 READ 和 4 WRITE。但是当我将它们连接在一起时,我只需要 2 个管道?我是不是在哪里想错了?
谢谢
【问题讨论】:
你需要 3 个管道来链接 4 个命令。 您能否详细说明一下我上面发布的示例? @eckes 您的示例使用 fd[3] double。如果你使用 fd[0] - fd[5] 你有 6 个 fds by 3 个管道。您在命令中使用的相同 3 管道符号。 我相信我修复了这个例子。所以我现在理解的是,我应该创建 amountOfCommands - 1 个总管道?所以 5 个命令就是 4 个管道,对吧? @eckes 是的,您基本上计算了命令之间的间隙。您还可以做的是实际创建一个 fd 对数组,它更接近于签名类型。无论如何,您的示例代码是错误的,因为它没有使用数组的偏移量,管道(fd)只会填充前两个插槽 【参考方案1】:n
命令需要 n-1
管道。在迭代创建管道时,您需要确保为每个调用提供一个新的 2 元素 int 数组(偏移量):
int pipes = numOfCommands - 1;
int fd[pipes][2];
for (int i=0;i<pipes;i++)
pipe(fd[i]);
【讨论】:
以上是关于将管道连接到子进程的主要内容,如果未能解决你的问题,请参考以下文章