我正在處理需要我創建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根管子?我在某個地方想錯了嗎?
謝謝
您需要3個管道來鏈接4個命令。 – eckes
您能否詳細說明我在上面發佈的示例? @eckes – Cows42
您的示例使用fd [3] double。如果你使用fd [0] - fd [5],你有3個管道6個fds。您在命令中使用的3個管道符號。 – eckes