我会执行这个命令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'终止,则它必须在等待之前关闭管道的末端,否则这两个过程将会死锁。 –