我正在完成一项要求我创建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个管道?我在某处想错了吗?
谢谢
答案 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]);