我會執行這個命令ls -al/| tr a-j A-J | tr k-z K-Z
,我會從父進程創建三個孩子。三個孩子之間的管道
我知道,我已經打開兩個管道,讓父親等待他的所有兒童(關閉所有的管道)和我已經到
- 接近STDIN第一個孩子的孩子
- 接近STDOUT在第一管和STDIN第二管,在第二個孩子
- 接近STDOUT的第三個孩子
現在,這是我的代碼。如果我只有兩個孩子運行它,它的工作原理。但是,如果我嘗試與三個孩子一起運行,它不起作用。
// command is ls -al/| tr a-j A-J | tr k-z K-Z
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
int fd1[2];
int fd2[2];
pid_t pid = 0;
pipe(fd1);
pipe(fd2);
pid = fork();
if(pid == 0) {
close(fd1[0]);
dup2(fd1[1], 1);
close(fd1[1]);
execlp("ls", "ls", "-al", "/", NULL);
}
pid = fork();
if(pid == 0) {
close(fd1[1]);
dup2(fd1[0], 0);
close(fd1[0]);
close(fd2[0]);
dup2(fd2[1], 1);
close(fd2[1]);
execlp("tr", "tr", "a-j", "A-J", NULL);
}
pid = fork();
if(pid == 0) {
close(fd2[1]);
dup2(fd2[0], 0);
close(fd2[0]);
execlp("tr", "tr", "k-z", "K-Z", NULL);
}
close(fd1[0]);
close(fd1[1]);
close(fd2[0]);
close(fd2[1]);
while ((pid = wait(NULL)) != -1);
exit(0);
}
在此先感謝您。
您從不關閉父級中的任何管道末端。正在讀取管道的孩子正在等待管道的所有*寫入結束關閉,但父母仍然保持着一端打開。關閉它。 –
我最後關閉了管道。我必須在開始時關閉它們? –
在管道的所有寫入結束都關閉之前,tr'不會終止。如果父'等待'tr'終止,則它必須在等待之前關閉管道的末端,否則這兩個過程將會死鎖。 –