【发布时间】:2015-06-13 19:50:09
【问题描述】:
我正在尝试制作一个执行以下命令的程序,该命令使用管道将一个的输出连接到下一个的输入,并采用两个参数 DIR(目录)和 ARG(文件类型,例如: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;
}
好像卡住了?不知道为什么?
【问题讨论】:
-
为什么在调用
sort之前要等待grep终止? -
在我的系统上,程序卡在
waitpid(grep_pid, &status, 0);线上,因为grep永远不会终止。为什么不关闭父进程中与第一个管道关联的文件描述符?