我试图在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排序
但是下面的命令不起作用,尽管它几乎是一样的
分类tmp1.out grep tmp排序
(tmp1.out包含cur dir中的文件列表,与ls的输出相同)
也没有错误消息,但是它只是在屏幕上不打印任何东西(尽管最后命令的STDUT没有改变)。
附言:猫tmp1.out grep tmp也很好。
tmp1.out的内容:
A.退出
样品
壳牌公司
tmp1.输出
tmp.out公司
不列颠哥伦比亚省
有什么意见吗?

最佳答案

我知道你想写一个shell,但是你考虑过使用popen吗?
文件*p=popen(“cat tmp1.out grep tmp sort”,“r”);

07-24 09:44