2015-12-01 6 views
2

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

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

Пусть головы быть ваш родительского процессом, рода — процесса его ребенка и ей ребенка рода, или внук руководитель.

Вам нужны две трубы, таким образом, два массива — fd и fd1. Пусть FD труба соединить рода с головы и fd1 — ей с родом.

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

    } 
}