我正在尝试创建一个执行以下命令的程序,将一个输出连接到下一个使用管道的输入并使用两个参数 DIR (目录)和 ARG < / strong>(filetype,example:jpg)。
ls DIR -laR | grep ARG |排序
以下是代码:
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Invalid arguments. <dir> <arg>\n");
exit(1);
}
int pipe_fd1[2];
int pipe_fd2[2];
pid_t ls_pid, grep_pid;
int status;
pipe(pipe_fd1);
pipe(pipe_fd2);
ls_pid = fork();
if (ls_pid == 0) { //first child ls DIR -laR
dup2(pipe_fd1[1], STDOUT_FILENO);
close(pipe_fd1[0]);
execlp("ls", "ls", argv[1], "-laR", NULL);
} else if (ls_pid > 0) {
grep_pid = fork();
if (grep_pid == 0) { //second child grep ARG
dup2(pipe_fd1[0], STDIN_FILENO);
dup2(pipe_fd2[1], STDOUT_FILENO);
close(pipe_fd1[1]);
close(pipe_fd2[0]);
waitpid(ls_pid, &status, 0);
execlp("grep", "grep", argv[2], NULL);
} else if (grep_pid > 0) { //parent sort
dup2(pipe_fd2[0], STDIN_FILENO);
close(pipe_fd2[1]);
waitpid(grep_pid, &status, 0);
execlp("sort", "sort", NULL);
}
}
return 0;
}
似乎被卡住了?不确定为什么?
答案 0 :(得分:3)
您永远不会关闭父级List<Flower>
,因此null
和pipe_fd1
不知道何时停止读取输入:因为管道读取和写入结束永远不会关闭父母,读者阻止等待更多的输入永远不会到来。你需要关闭它。
此外,您不需要grep
:管道工作的方式可确保输入在整个管道中按顺序线性流动。
这是解决这些问题的工作版本:
sort