【发布时间】: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)只会填充前两个插槽