Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多管道实现在C中不起作用_C_Linux_Pipe - Fatal编程技术网

多管道实现在C中不起作用

多管道实现在C中不起作用,c,linux,pipe,C,Linux,Pipe,我试图在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++)

我试图在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);

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

对于(k=0;k我知道您正在尝试编写一个shell,但是您考虑过使用popen吗


FILE*p=popen(“cat tmp1.out | grep tmp | sort”,“r”);

问题可能是调用
waitpid()
在循环中,因此在第一个进程终止之前,您不会启动第二个进程。但是现在,如果达到管道缓冲区大小,并且出现死锁,或者某个进程可能会被断开的管道终止,则第一个进程可能会挂起。此外,
for(k=0;kThe waitpid()是由父级执行的,我这样做的原因是,我希望父级等待执行第一个命令。另外,for循环num_of_pipes+1次,因为有num_of_pipes+1个命令(每个命令一个进程)。我希望很清楚。让我困惑的是命令ls | grep tmp | sort工作正常:(通常管道的两侧应该同时运行。我仍然认为问题可能是在您的情况下它们没有运行。如果这是真正的问题,不同的程序可能会做出不同的反应。我只需调用
waitpid()
in for all
processid[k]
在启动所有子进程后,再进行一次循环,看看会发生什么。尝试了这种方法。在for(k=0…)之后,添加了一个单独的for循环来等待子进程。仍然没有运气:(太糟糕了,这只是一个猜测……目前我没有其他想法,但我会认为这很可能是一个家庭作业,所以我不认为涉及
系统
popen
和/或
/bin/sh
的解决方案符合要求。是的。我想从用户那里获得输入。研究现有自由软件的源代码ke
sash
bash
。另外,
strace-f
可以帮助他们理解所涉及的系统调用。另外,请阅读[高级Linux编程](