2つのプロセスを互いにパイプできますか?


8

、このページから設計・4.4BSDオペレーティングシステムの実装、それはと言われます。

パイプとソケットの主な違いは、パイプが通信チャネルをセットアップするために共通の親プロセスを必要とすることです。

ただし、正しく記録した場合、新しいプロセスを作成する唯一の方法はfork、既存のプロセスに対するものです。したがって、2つのプロセスが共通の祖先を持つことができなかった方法を実際に確認することはできません。次に、プロセスの任意のペアを互いにパイプできると考えるのは正しいことでしょうか。


1
あなたの質問が本当に「共通の祖先」についてであるならば、それはあなたの引用が言っていることではありません。親は祖先ですが、すべての祖先が親であるとは限りません。
msw 2013年

ps auxfプロセスの祖先についてのアイデアを見てください。
マイカ2013年

@msw 2つのプロセスが同じ直接の親を持つ必要があることを意味しますか?いとこであること(つまり、祖父母が共通していること)では十分ではありませんか?
qdii 2013年

回答:


7

次に、プロセスの任意のペアを互いにパイプできると考えるのは正しいことでしょうか。

あんまり。

パイプは、子プロセスがフォークされる前に、親プロセスによってセットアップされる必要があります。子プロセスがフォークされると、そのファイル記述子は「外部から」操作できなくなり(デバッガーなどを無視して)、親(または他のプロセス)は事後に「comms。チャネルのセットアップ」の部分を実行できなくなります。 。

したがって、すでに実行されている2つのランダムプロセスを取得する場合、それらの間に直接パイプを設定することはできません。通信するには、なんらかの形式のソケット(または別のIPCメカニズム)を使用する必要があります。(ただし、一部のオペレーティングシステム、特にFreeBSDでは、Unixドメインソケットでファイル記述子を送信できることに注意してください。)


4

その文はあまり明確ではありません。最初に、パイプを設定するプロセスは、親、祖父母、または祖父母、祖父母、または通信プロセスの1つになる可能性があるため、祖先ある必要があります。次に、「パイプが必要な場合は共通の祖先プロセスが存在する必要がある」という意味ではありませんが、「パイプが必要な場合は共通の祖先プロセスが設定する必要がある」という意味です。

内部では、プロセスはそれ自体とパイプを確立します。パイプは、他と同様のファイル記述子、またはより正確には両端に1つずつのファイル記述子のペアです。パイプを作成したプロセスは、それをすぐに使用してデータを自分自身に送信できますが、これが役立つことはめったにありません(セルフパイプにも使用されます)。

典型的なイディオムは、プロセスがパイプをセットアップしてから子プロセスをforkし、パイプの一方の端を親で閉じ、もう一方の端を子で閉じることです。これにより、親プロセスと子プロセスが一方向に通信できます。プロセスが双方向通信を必要とする場合、2つのパイプが必要です(パイプが双方向である一部のUNIXバリアントを除く)。

パイプは子によって順番に継承されるため、パイプを作成したプロセスは通信に関与しない可能性があります。たとえばls | rot13、次のような2つの外部コマンドの間に作成されたシェルのパイプには、次の手順が含まれます。

  • シェルはパイプを作成します。
  • シェルはプロセスをフォークします。子供はパイプの読み出し側を閉じて呼び出すexecvels
  • シェルはプロセスをフォークします。子供は、パイプの書き込み側を閉じて呼び出すexecverot13
  • シェルはパイプの両端を閉じ、両方のサブプロセスが終了するのを待ちます。

2つの既存のプロセスが互いに通信したい場合は、名前付きパイプを使用できます。(まあ、ファイル記述子の受け渡しもありますが、気弱な人には向いていません。)


2

パイプラインのシェルは、パイプラインのいくつかのメンバー間に通信チャネルを設定する共通の親です。

どのプロセスも他のプロセスにパイプすることができます。一緒にパイプすることができる唯一のプロセスは、stdinから読み取ってstdoutに書き込む「フィルター」です。

たとえば、次のコマンドを発行した場合

$ tail -f /etc/motd | tail -f | cat > /dev/null

ps -eaH 猫とその2つの尾が呼び出し側シェルの子であることを示します。

 1675 pts/0    00:00:00     bash
 2483 pts/0    00:00:00       tail
 2484 pts/0    00:00:00       tail
 2485 pts/0    00:00:00       cat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.