2017-09-24 88 views
0

我正在處理需要我創建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. 
} 

讓我們假設我們要在這個例子中創建管道:

殼$>貓file.txt的| grep'pattern1'| grep'pattern2'| 廁所-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根管子?我在某個地方想錯了嗎?

謝謝

+0

您需要3個管道來鏈接4個命令。 – eckes

+0

您能否詳細說明我在上面發佈的示例? @eckes – Cows42

+0

您的示例使用fd [3] double。如果你使用fd [0] - fd [5],你有3個管道6個fds。您在命令中使用的3個管道符號。 – eckes

回答

0

你需要n-1管材n命令。迭代創建管道時,需要確保爲每個調用提供一個新的2元素int數組(偏移量):

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

噢,好的,謝謝! – Cows42