1

パイプの 1 つの実装は次のとおりです。

#define STD_INPUT 0
#define STD_OUTPUT 1
pipeline(char *process1, char *process2)
{
    int fd[2];

    pipe(&fd[0]);
    if (fork() != 0) {
        /* The parent process executes these statements. */
        close(fd[0]);
        close(STD_OUTPUT);
        dup(fd[1]);
        close(fd[1]);    /* this file descriptor not needed anymore */
        execl(process1, process1, 0);
    }
    else {
        /* The child process executes these statements. */
        close(fd[1]);
        close(STD_INPUT);
        dup(fd[0]);
        close(fd[0]);   /* this file descriptor not needed anymore */
        execl(process2, process2, 0);
   }
}

それぞれの dup 呼び出しに続く 2 つのステートメントの使用に混乱しています。

close(fd[1]);    /* this file descriptor not needed anymore */

close(fd[0]);   /* this file descriptor not needed anymore */

記述子は不要になったと言われていますが、私にとってそれらの記述子はパイプの両端を表しているのに、なぜ不要になったのでしょうか?

4

1 に答える 1

4

このpipe呼び出しは、単方向通信の読み取り記述子と書き込み記述子の両方を返します。ただし、ライターは読み取り記述子 ( ) を必要としませんfd[0]。また、リーダーは書き込み記述子 ( ) を必要としませんfd[1]。したがって、fork呼び出し後の各プロセスは、必要のない記述子を閉じ、必要な記述子を使用します。

したがって、親はあなたの例の作家です。最初に閉じてfd[0]から閉じますSTD_OUTPUT。次に、 が複製されます。これは、利用可能fd[1]になったので、現在STD_OUTPUT入っています。パイプの出力記述子が複製されたため、これも不要になったため、閉じられます。ここで、ライターが に何かを書き込むSTD_OUTPUTと、パイプの出力記述子に書き込まれます。

リーダーである子は、同様のロジックを実行しますが、別の記述子に対して実行します。最初に閉じfd[1]てから閉じますSTD_INPUT。次に複製fd[0]し、その結果、記述子が になりSTD_INPUTます。複製後、パイプの入力記述子は不要になるため、クローズされます。これで、リーダーが から何かを読み取るときSTD_INPUT、パイプの入力記述子から読み取られます。

于 2012-08-23T23:56:18.327 に答える