我試圖做一個程序,執行下面的命令,將一個輸出連接到下一個使用管道的輸入並帶兩個參數DIR(directory)和ARG(文件類型,例如:jpg)。程序卡在管道上(執行ls grep排序)
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;
}
它似乎被卡住?不知道爲什麼?
你爲什麼要等待'grep'調用'sort'之前終止? – fuz
在我的系統上,程序停留在'waitpid(grep_pid,&status,0)'行;''grep'永遠不會終止。爲什麼不關閉父進程中與第一個管道關聯的文件描述符? – fuz