【问题标题】: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)只会填充前两个插槽

标签: pipe fork


【解决方案1】:

n 命令需要 n-1 管道。在迭代创建管道时,您需要确保为每个调用提供一个新的 2 元素 int 数组(偏移量):

int pipes = numOfCommands - 1;
int fd[pipes][2];
for (int i=0;i<pipes;i++)
  pipe(fd[i]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2020-09-08
    • 2012-08-24
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多