2016-12-27 2 views
0

В настоящее время я работаю над небольшой оболочкой, и я пытаюсь выполнить выполнение задания, состоящего из нескольких команд (таких как «ls | sort»). У меня возникла проблема, когда дело доходит до перенаправления, поскольку программа сортировки, похоже, сталкивается с «плохим дескриптором файла». Вот код:Shell и работа с несколькими командами

Для первой команды:

if (pipe(job->tubes[num_comm]) == -1) 
        { 
          perror("Erreur création tube"); 
          exit(errno); 
        } 
        pid_t pid = fork(); 
        if(pid==0) { 
          sig->sa_handler=SIG_DFL; 
          sigaction(SIGINT, sig, NULL); 
          close(job->tubes[num_comm][0]); 
          dup2(job->tubes[num_comm][1], 1); 
          close(job->tubes[num_comm][1]); 
          execvp(ligne_analysee->commandes[num_comm][0], ligne_analysee->commandes[num_comm]); 
        } 
        job->pids[num_comm]=pid; 
        close(job->tubes[num_comm][0]); 

Для последней команды:

    pid_t pid = fork(); 
        if(pid==0) { 
          dup2(job->tubes[num_comm-1][1], 0); 
          close(job->tubes[num_comm-1][1]); 
          sig->sa_handler=SIG_DFL; 
          sigaction(SIGINT, sig, NULL); 
          execvp(ligne_analysee->commandes[num_comm][0], ligne_analysee->commandes[num_comm]); 
        } 
        job->pids[num_comm]=pid; 
        close(job->tubes[num_comm][1]); 

Спасибо за вашу помощь!

ответ

0

Я неправильно понял, как работают трубы, конец записи должен быть изменен дочерним, но не родительский, конец чтения должен быть непосредственно закрыт для ребенка. Родитель должен оставить прочитанный конец открытым для следующего ребенка, чтобы читать его (вторая команда в нашем случае) ... Спасибо, проблема решена!

Смежные вопросы