2016-12-27 4 views
0

現在、私は小さなシェルで作業していますが、複数のコマンド( "ls | sort"など)で構成されるジョブの実行を実装しようとしています。 ソートプログラムが「不正なファイル記述子」に遭遇しているように見えるので、リダイレクションに関する問題に直面しています。最初のコマンドについては複数のコマンドを持つシェルとジョブ

:最後のコマンドについては

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

私はパイプの働きを誤解していましたが、書き込み終了は子によって変更されますが、親ではなく、読み込み終了は子で直接閉じられるべきです。 親は、次の子が読むことができるように、読み込み側を開いたままにする必要があります(私たちの場合は2番目のコマンドです)...ありがとう、問題解決済み!

関連する問題