0

最近パイプについて学びました。「|」をエミュレートしたいと思います。シェルによって提供されるギミック。

以下のコードでは、親プロセスが2つの子プロセスを生成し、その後、それらはパイピングを実行し、lsとgrepに置き換えられます。それが発生している間、親プロセスは辛抱強く待機します。問題は、子プロセスがパイプを介して画面にデータを送信することに成功したにもかかわらず、子プロセスが終了しないことです。

SOのパイプに関する投稿は他にもありますが、親プロセスが2つの子を起動するセットアップは見たことがありません。親が1人の子供と通信しているのを見ただけです。

int p0[2];
pipe(p0);         //creating pipe

if(fork() == 0) { //child 1
    dup2(p0[0], STDIN_FILENO);
    close(p0[0]); close(p0[1]);
    execlp("grep","grep","a",NULL);
} 
else {            //parent
    if(fork() == 0) { //child 2
        dup2(p0[1], STDOUT_FILENO);
        close(p0[0]); close(p0[1]);
        execlp("ls","ls",NULL);
    }
    else {    //parent
        wait(NULL);
        wait(NULL); //waiting for c1 and c2

        close(p0[0]); close(p0[1]);
        printf("parent exit\n");
    }
}

私の質問は次のとおりです。子プロセスが終了しないのはなぜですか?フォークパイプ構造は健全ですか、それとも完全に間違っていますか?

4

1 に答える 1

0

最後のセクションで待機を開始する前に、パイプを閉じます。

于 2012-12-27T22:26:18.170 に答える