2017-04-01 5 views
0

私は自分のシェルを書いて三重配管を扱う関数を書いたが、execveの後にシェルが終了する問題がある。私は問題は私が余分な時間をフォークする必要があると思う?しかし、私は完全に配管されたプログラムを完璧に実行するので、どこにあるのかは完全にはわかりません。また、この実装でwait(2)を使用することはありません。その実装にも何か関係があるかどうかはわかりません。ありがとうexecveが元のプログラムを終了するのを止める方法

int fd[2]; 
int fd2[2]; 

if (pipe(fd) == -1) 
{ 
    perror("ERROR CREATING PIPE"); 
    return; 
} 

pid_t pid = fork(); 

if (args4[0] != NULL) 
{ 
    switch(pid) 
    { 
     case -1: 
      printf("%s\n", "fail to fork"); 
      return; 
     case 0: 
      if (pipe(fd2) == -1) 
      { 
       perror("ERROR CREATING PIPE"); 
       return; 
      } 
      switch(pid = fork()) 
      { 
       case -1: 
        printf("%s\n", "fail to fork"); 
        return; 
        break; 
       case 0: 
        if (dup2(fd2[1], STDOUT_FILENO) == -1) 
        { 
         printf("%s\n", "fail to dup"); 
         return; 
        } 
        close(fd2[0]); 
        close(fd2[1]); 
        execve(args2[0], args2, environ); 
        exit(1); 
       default: 
        if (dup2(fd2[0], STDIN_FILENO) == -1) 
        { 
         printf("%s\n", "fail to dup"); 
         return; 
        } 
        if (dup2(fd[1], STDOUT_FILENO) == -1) 
        { 
         printf("%s\n", "fail to dup"); 
         return; 
        } 
        close(fd2[0]); 
        close(fd2[1]); 
        execve(args3[0], args3, environ); 
        exit(2); 
      } 
      exit(3); 

     default: 
      if (dup2(fd[0], STDIN_FILENO) == -1) 
      { 
       printf("%s\n", "fail to dup"); 
       return; 
      } 
      close(fd[0]); 
      close(fd[1]); 
      printf("%s\n", "4"); 
      execve(args4[0], args4, environ); 
      exit(4); 
    } 
} 
+0

呼び出すサブプロセスごとにforkする必要があります。 –

+0

はい私は理解するために、どのプロセスをフォークするかを理解するのに問題があります。私はそれがexecve(args2 [0]、args2、environ)であると思います。なぜなら、それが呼び出す最後のプロセスであるからです。私はすべての3人の幹部の前にフォークを試みましたが、それは助けにはなりません。 – ricefieldboy

+0

こんにちは。ありがとうございました。 args4 – ricefieldboy

答えて

0

3つのプロセスがあるので、2回フォークしました。それらのそれぞれは、execveによって作成されたそれぞれのプロセスに置き換えられます。 execve()は(成功して)戻ってこないので、exit()ステートメントには決して行きません。ここにあなたのコードは、(あなたが明確にパイプを設定する方法を理解し)、パイプなしで書き直され、不要な書類なし:あなた以上の書き換えのコードで

pid_t pid = fork(); 
if (pid) { 
    execve(args4[0], args4, environ); 
} 
else { 
    pid = fork(); 
    if (pid) { 
     execve(args3[0], args3, environ); 
    } 
    else { 
     execve(args2[0], args2, environ); 
    } 
} 

より簡単に、あなたがこのような三つのプロセスを取得することがわかります:

args2 [0] | args3 [0] | arg4 [0]

関連する問題