1

次のコード fork() の共通の親からの 2 つの子があり、それらの間のパイプラインを実装しています。親でwait()関数を呼び出すと、プログラムが完全に実行されるだけです。ただし、wait() 関数を (両方の子から取得するために) 2 回呼び出そうとすると、プログラムは何もせず、強制終了する必要があります。

ここで二人の子供が待ちきれない理由を誰か教えてもらえますか?

int main()
{
    int status;
    int pipeline[2];
    pipe(pipeline);

    pid_t pid_A, pid_B;

    if( !(pid_A = fork()) )
    {
        dup2(pipeline[1], 1);
        close(pipeline[0]);
        close(pipeline[1]);
        execl("/bin/ls", "ls", 0);
    }

    if( !(pid_B = fork()) )
    {
        dup2(pipeline[0], 0);
        close(pipeline[0]);
        close(pipeline[1]);
        execl("/usr/bin/wc", "wc", 0);
    }

    wait(&status);
    wait(&status);
}
4

2 に答える 2

3

子をフォークした後、親のパイプの両端を閉じる必要があります。問題は、の出力がls親に送信され、wcが入力を待機していることです。したがって、最初の待機はをクリーンアップしますlsが、2番目の待機は、wcデータを受信して​​いないパイプでブロックされている待機中です。

于 2012-05-14T13:36:26.163 に答える
3

プロセス B ( wc) は、入力ストリームでファイルの終わりを受け取るまで終了しません。パイプのもう一方の端は、プロセス A の出力ストリームと親プロセスの両方として共有されるため、プロセス B を待つ前に親プロセスで共有pipeline[1]する必要があります。close(pipeline[1])

于 2012-05-14T13:38:31.167 に答える