程序卡在管道上(exec ls grep sort)

时间:2015-06-13 19:50:10

标签: c linux pipe fork dup2

我正在尝试创建一个执行以下命令的程序,将一个输出连接到下一个使用管道的输入并使用两个参数 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;
}

似乎被卡住了?不确定为什么?

1 个答案:

答案 0 :(得分:3)

您永远不会关闭父级List<Flower>,因此nullpipe_fd1不知道何时停止读取输入:因为管道读取和写入结束永远不会关闭父母,读者阻止等待更多的输入永远不会到来。你需要关闭它。

此外,您不需要grep:管道工作的方式可确保输入在整个管道中按顺序线性流动。

这是解决这些问题的工作版本:

sort