C程序对三个命令执行管道

时间:2015-12-01 00:20:08

标签: c command pipe fork ansi-c

我必须编写一个程序来执行与 du |相同的操作排序|命令行中的头会这样做,但我卡住了,我的程序无效。现在的输出是 112。,程序不会终止。请帮忙,我不知道该怎么做!

Result.Failure

}

1 个答案:

答案 0 :(得分:1)

成为您的父流程排序 - 其子流程 du < / b> - 排序孩子,或 孙子。

你需要两个管道,因此,两个阵列 - fd和fd1。让fd管道用 head 连接 sort ,用 sort 连接fd1 - du

您将需要一个大的switch语句,它将确定您当前是否在父进程( head ,pipe(fd)不为0)或子进程( sort ,pipe(fd)为0)。如果您在 sort 中,则需要创建fd1管道并运行孙子进程 du 。现在,由于您再次有两个进程(总共三个),您需要根据您的位置设置管道 - 无论您是孙子进程还是子进程。您可以使用与管道fd类似的switch语句。这里的技巧是正确设置fd1管道的输入和输出。

您的代码必须执行以下操作:

int main(void) {

    int fd[2];             // sort <===> head
    int fd1[2];            //  du  <===> sort

    pipe(fd);

    switch (fork()) {
        case 0:            // Are we in sort?
             pipe(fd1);    // If yes, let's make a new pipe!

             switch (fork()) {
                 case 0:   // Are we in du?
                     dup2(fd1[1], STDOUT_FILENO);
                     close(fd1[0]);
                     close(fd1[1]);
                     execl("/usr/bin/du", "du", (whatever directory), NULL);
                     exit(1);

                 default:
                     /* If not in du, we're in sort! in the middle!
                        Let's set up both input and output properly.
                        We have to deal with both pipes */
                     dup2(fd1[0], STDIN_FILENO);
                     dup2(fd[1], STDOUT_FILENO);
                     close(fd1[0]);
                     close(fd1[1]);
                     execl("/usr/bin/sort", "sort (flags if needed)", (char *) 0);
                     exit(2);
             }

            exit(3);

        default:            // If we're not in sort, we're in head
            dup2(fd[0], STDIN_FILENO);
            close(fd[0]);
            close(fd[1]);
            execl("/usr/bin/head", "head (flags if needed)", (char *) 0);
            exit(4);

    }   
}