0

でこの関数を実行するとls | head、ファイルとディレクトリを出力した後、2 番目の子プロセスでハングします。誰かが私がここで見逃していることを教えてもらえますか? 前もって感謝します

int unipipe(char* lhs[], char* rhs[])
{
    int pfd[2];
    int status, cid;
    pid_t pid;
    char buf;
    if((lhs != NULL) && (rhs != NULL))
    {
      if(pipe(pfd) != 0)
      {
        perror("pipe");
        return -1;
      }
    if((pid = fork()) < 0)
    {
        perror("fork");
        return -1;  
    }
    else if(pid == 0)
   {
       close(1); //close the unused read end
      dup2(pfd[1], STDOUT_FILENO);
      //execute the left-hand side command
      close(pfd[0]);
      execvp(lhs[0], lhs);
       _exit(EXIT_SUCCESS);
    }

   if(setpgid(pid, 0) < 0)
   {
     perror("setpgid"); 
     return -1;
   };

  cid = waitpid(pid, &status, 0);
  if((pid = fork()) == 0)
    {
        close(0);
        dup2(pfd[0], STDIN_FILENO);
        close(pfd[1]);  //close the unused write end
        execvp(rhs[0], rhs);
        _exit(EXIT_SUCCESS);
    } 
    else
    {
           waitpid(pid, &status, 0);
    }
}
4

2 に答える 2

2

最初のプロセスが終了するのを待ってから、2 番目のプロセスを開始します。各パイプにはバッファーがあり、このバッファーがいっぱいになると、I/O 関数はブロックされ、パイプから数バイトが読み取られるのを待って、さらに「流入」できるようにします。最初のプロセスがパイプでブロックされているため、終了しない可能性があります。

子ごとに 1 つずつ、タイプ pid_t の 2 つの変数を宣言し、両方が正常に開始されてから両方を待機します。

于 2012-05-25T01:24:39.057 に答える
0

プログラムを実行するには、最初のものを削除します。

cid = waitpid(pid, &status, 0);

で:

else
{
       waitpid(pid, &status, 0);
}

あなたはそれを次のように置き換えます:

wait(); // for the fist child
wait(); // for the second child

プログラムが実行されます。

于 2012-05-25T15:38:29.883 に答える