その文はあまり明確ではありません。最初に、パイプを設定するプロセスは、親、祖父母、または祖父母、祖父母、または通信プロセスの1つになる可能性があるため、親は祖先である必要があります。次に、「パイプが必要な場合は共通の祖先プロセスが存在する必要がある」という意味ではありませんが、「パイプが必要な場合は共通の祖先プロセスが設定する必要がある」という意味です。
内部では、プロセスはそれ自体とパイプを確立します。パイプは、他と同様のファイル記述子、またはより正確には両端に1つずつのファイル記述子のペアです。パイプを作成したプロセスは、それをすぐに使用してデータを自分自身に送信できますが、これが役立つことはめったにありません(セルフパイプにも使用されます)。
典型的なイディオムは、プロセスがパイプをセットアップしてから子プロセスをforkし、パイプの一方の端を親で閉じ、もう一方の端を子で閉じることです。これにより、親プロセスと子プロセスが一方向に通信できます。プロセスが双方向通信を必要とする場合、2つのパイプが必要です(パイプが双方向である一部のUNIXバリアントを除く)。
パイプは子によって順番に継承されるため、パイプを作成したプロセスは通信に関与しない可能性があります。たとえばls | rot13
、次のような2つの外部コマンドの間に作成されたシェルのパイプには、次の手順が含まれます。
- シェルはパイプを作成します。
- シェルはプロセスをフォークします。子供はパイプの読み出し側を閉じて呼び出す
execve
にls
。
- シェルはプロセスをフォークします。子供は、パイプの書き込み側を閉じて呼び出す
execve
にrot13
。
- シェルはパイプの両端を閉じ、両方のサブプロセスが終了するのを待ちます。
2つの既存のプロセスが互いに通信したい場合は、名前付きパイプを使用できます。(まあ、ファイル記述子の受け渡しもありますが、気弱な人には向いていません。)