0

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

      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++;
}
4

1 回答 1

1

您的错误是认为您需要转到“下一个”命令。全部启动。

这是基本的想法,对于像这样的管道A | B | C

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

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

于 2011-09-29T00:34:28.260 回答