1

Cで複数のパイプを実装しようとしています。これは、パイプを処理する関数の主要部分です

ProcesscommandwithPipes()
{
............................

for (k=0; k <= num_of_pipes; k++)
   {

      read[k]= -1;
      write[k] = -1;
   }
   //create required number of pipes
    for(j=0; j < num_of_pipes; j++)
    {
       if( pipe(fd) == -1 )
       {
          perror("Pipe failure");
          return;
       }
       read[j+1] = fd[0];
       write[j] = fd[1];
    }


    for(k=0; k<= num_of_pipes; k++)
    {

      pid = fork();

      if(pid < 0 )
      {
         printf("fork failed\n");
      }
      else if (pid == 0)
      {
            if(write[k] != -1)
         {

            if( dup2(write[k],1) == -1){
            perror("dup2 error");
            exit(1);}
         }

        if(read[k] != -1)
         {

            if( dup2(read[k],0) == -1)
            {
              perror("dup2read  error");
              exit(1);
            }
         }

        for (h=0; h<= num_of_pipes;h++)
        {
              close(write[h]);
              close(read[h]);
        }


          if(execvp((const char*)commandArgv[k][0], commandArgv[k]) < 1)
          {
            perror("error");
            exit(1);
          }

        exit(0);
      }
      else
      {
        processid[k] = pid;

        printf("waiting on process:%d\n", processid[k]);
        close(write[k]);
        close(read[k]);
        waitpid(processid[k], &status, 0);

       }
     }

何らかの理由で、次のコマンドは正常に機能します ls|grep tmp|sort

ただし、次のコマンドは機能しませんが、ほとんど同じ です cat tmp1.out|grep tmp|sort

(tmp1.outには、lsの出力と同じ、curディレクトリ内のファイルのリストが含まれています)エラーメッセージもありません.しかし、画面に何も出力せずに終了します(ただし、最後のコマンドのstdoutは変更されません)

PS: cat tmp1.out|grep tmpも正常に動作します。

tmp1.out の内容: a.out サンプル shell.c tmp1.out tmp.out bc

入力はありますか?

4

2 に答える 2