c中用于linux的迭代管道实现

时间:2011-09-29 00:31:36

标签: c piping

我知道这个问题被问了很多,但我仍然对如何解决我的问题感到困惑。我试图编写处理命令行输入的代码,以获得多个管道的可能性。但是,我不成功和我的代码,虽然执行不能正常工作。错误是一旦我分叉了孩子们,我就无法进入第一个命令执行后管道进入的下一个命令。如何在不抓取错误的文件描述符的情况下移动到管道中的下一个命令?这是一大堆代码;

      a = 0;
      while (a < cmdnum)
      {
      pid[a] = fork();
      if( pid[a] == 0)
      {
      if( a == 0)
        {

          close(1);
          dup(p1_to_pn[a][1]);
          for( k = 0; k < nump; k++)
            {
              close(p1_to_pn[k][0]);
              close(p1_to_pn[k][1]);
            }  

          args = tokenize(cmd[a]);
          execv(args[0], args);
        }
      else if ( a == (cmdnum-1))
        {

          close(0);
          dup(p1_to_pn[a][0]);
          for( k = 0; k < nump; k++)
            {
              close(p1_to_pn[k][0]);
              close(p1_to_pn[k][1]);
            }
          args = tokenize(cmd[a]);

          i = execv(args[0], args);
        }
      else
        {

          close(0);
          dup(p1_to_pn[a][0]);
          close(1);
          dup(p1_to_pn[a][1]);
          for( k = 0; k < nump; k ++)
            {
              close(p1_to_pn[k][0]);
              close(p1_to_pn[k][1]);
           }
          args = tokenize(cmd[a]);

          execv(args[0], args);
        }
    }
  a++;
}

1 个答案:

答案 0 :(得分:1)

您的错误在于您需要转到“下一步”命令。全部启动。

对于像A | B | C

这样的管道,这是基本思路

父进程读取命令行。对于每个新命令,它将分叉一个新进程,并最终执行它。父进程已经有fd 0,1,2 open(STDIN,STDOUT和STDERR。)当你点击管道时,使用pipe(2)和dup(2)系统调用来创建一个新的fd;分叉下一个过程。

所有fd操作都在父进程中进行。