C программой для выполнения трубы на три команды

Мне нужно написать программу, которая будет выполнять ту же операцию, что и du | сортировать | голову в командной строке сделаю, но я застрял, и моя программа не работает. Выход прямо сейчас 112 . и программа не заканчивается. Пожалуйста, помогите, я не знаю, что делать!

int main(void) {

int fd[2];
int fd1[2];
int pid;

if (pipe(fd) == -1) {
    perror("Pipe");
    exit(1);
}

switch (fork()) {
 case -1:
    perror("Fork");
    exit(2);
 case 0:            
    dup2(fd[1], STDOUT_FILENO);
    close(fd[0]);
    close(fd[1]);
    execl("/usr/bin/du", "du", (char *) 0);
    exit(3);
}
if (pipe(fd1) == -1) {
    perror("Pipe");
    exit(1);
} 

switch (fork()) {
 case -1:
    perror("Fork");
    exit(2);
 case 0:    
    dup2(fd[0], STDIN_FILENO);
    dup2(fd1[1], STDOUT_FILENO);
    close(fd[0]);
    close(fd[1]);
    close(fd1[0]);
    close(fd1[1]);
    execl("/usr/bin/sort", "sort", (char *) 0);
    exit(3);
}

close(fd[0]);
close(fd[1]);

switch (fork()) {
 case -1:
    perror("Fork");
    exit(2);
 case 0:    
    dup2(fd1[0], STDIN_FILENO);
    close(fd1[0]);
    close(fd1[1]);
    execl("/usr/bin/head", "head", (char *) 0);
    exit(3);
}

}

1 ответ

Решение

Пусть head будет вашим родительским процессом, sort - его дочерним процессом, а du - дочерним процессом иливнукомголовы.

Вам нужны две трубы, таким образом, два массива - fd и fd1. Пусть fd pipe соединяетsort с головой, а fd1 - du с sort.

Вам понадобится один большой оператор switch, который будет определять, находитесь ли вы в родительском процессе (head, pipe (fd) не равен 0) или в дочернем (sort, pipe (fd) равен 0). Если вы всортировке, вам нужно создать канал fd1 и запустить процесс grandchild du. Теперь, поскольку у вас снова есть два процесса (всего три), вам нужно установить канал в соответствии с вашим местоположением - независимо от того, являетесь ли вы внуком или дочерним процессом. Вы можете использовать тот же оператор switch, что и для pipe fd. Хитрость здесь в том, чтобы правильно установить вход и выход для канала 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);

    }   
}
Другие вопросы по тегам