1

だから私は、親プロセスが子プロセスに書き込み、子プロセスがすぐに戻ることができるように、2セットのパイプの作成を含むプログラムを書いています...

子プロセスに次のコードがあります。

if(pid==0){  //child process
        cout << "executing child" << endl;
        close(fd1[WRITE_END]);
        close(fd2[READ_END]);
        if(dup2(fd1[READ_END],STDIN_FILENO) < 0 || dup2(fd2[WRITE_END],STDOUT_FILENO) < 0){
            cerr << "dup2 failed" << endl;
            exit(1);
        }
        cout << "test output" << endl;
        close(fd2[WRITE_END]);
        close(fd1[READ_END]);
        read(fd1[READ_END],buf,BUFFER_SIZE);
        cout << "Child process read " << buf << endl;
        execl("/bin/sort", "sort", "-nr", NULL);


    } else {  //... parent process

プログラムを実行すると、子プロセスからの出力として得られるのはexecuting childno だけtest outputです。ただし、dup2 呼び出しを処理する if ステートメントを削除すると、出力にtest output.

dup2 が原因で子プロセスが終了しない理由についてのアイデアはありますか?

(ちなみに、もともと、私の 2 つの dup2 は別々の if ステートメントで行われていました...テスト出力をテストの下に置くdup2(fd1[READ_END],STDIN_FILENO) < 0と出力されますが、他の dup2 条件付きテストの下に置くと出力されないので、それが私の問題であると確信しています)

前もって感謝します

4

1 に答える 1

2

dup2(fd2[WRITE_END],STDOUT_FILENO) への呼び出しは、STDOUT (C++ cout ストリームで使用される) を fd2 パイプに接続します。したがって、「テスト出力」がパイプに書き込まれます。

于 2013-03-07T21:23:07.620 に答える