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

親プロセスはコマンドラインを読み取ります。新しいコマンドごとに、新しいプロセスをフォークし、最終的に実行します。親プロセスはすでにfd0,1,2を開いています(STDIN、STDOUT、およびSTDERR)。パイプにヒットしたら、pipe(2)およびdup(2)システムコールを使用して新しいfdを作成します。次のプロセスをフォークします。

すべてのfd操作は親プロセスで行われます。

于 2011-09-29T00:34:28.260 に答える