将管道连接到子进程

时间:2017-09-24 13:04:17

标签: pipe fork

我正在完成一项要求我创建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 $&gt; cat file.txt | grep&#39; pattern1&#39; | grep&#39; pattern2&#39; |   wc -l <​​/ p>

这意味着我们将创建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个管道?我在某处想错了吗?

谢谢

1 个答案:

答案 0 :(得分:1)

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

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