プロセス間でデータを共有できるようにパイプライン(2)を実行する必要があるのはなぜですか。

プロセス間でデータを共有できるようにパイプライン(2)を実行する必要があるのはなぜですか。

これはUNIX中心の後続の質問です。

私だけのシェルを実装しようとしていますが、パイプ機能で停止しました。

いくつかの研究の終わりに、プロセス間でデータを共有するにはパイプライン(2)を実行する必要があることがわかりましたが、なぜそうするのか理解できません。最初のアイデアは、2番目のプロセスの標準を最初のプロセスの標準出力に変更することでした。プロセス入力 私の考え

それでは、なぜ私たちがこのようにパイプライン(2)を使うべきかを説明できる人はいますか? 管路

ベストアンサー1

端末で実行されるシェルの一般的なケースを考えてみましょう。シェルのすべてのstdin、stdout、stderrがこの端末に接続されています。ここで読むとは、ユーザーの入力を読むことを意味し、ここに書くとユーザーが読める内容が印刷されます。

シェルがコマンドを開始すると、コマンドはすべての fd を端末に接続します。シェルが実行する次のコマンドも同様です。このように:

+---------------+            +---------------+
|  first cmd    |            |  other cmd    |
|stdin   stdout |            |stdin   stdout |
+---------------+            +---------------+
   |       |                    |       |
   |       |                    |       |
   |       |                    |       |
 [------------------ tty -----------------]

今、あなたはこう言います。

私の最初のアイデアは、2番目のプロセスのstdinを最初のプロセスのstdoutに変更することでした。

しかし、上記の2つのfdを交換した場合、結果は変わりません。以前はすべてのfdがttyに接続されていたため、交換後はすべてのfdがttyに接続されます。

さて、tty側からfdの1つを分離するという意味であれば、実際にはそれはうまくいきません。 fdはカーネルデータ構造へのポインタに似ていますが、ttyを指すfdはパイプやネットワークソケットを指すfdとは異なります。あるいは、他の方法では、fdはプロセスとオペレーティングシステムとの間の「接続」のプロセスの側面に過ぎません。

したがって、OS側の他のものに接続できる別のfdが必要です。例えばパイプ。パイプはまだ2つのプロセス間を接続する以上のものです。2つの接続プロセスとオペレーティングシステムの間:

+---------------+            +---------------+
|  first cmd    |            |  other cmd    |
|stdin   stdout |            |stdin   stdout |
+---------------+            +---------------+
   |       |                    |       |
   |       |                    |       |
   |     [-w-- pipe driver -----r-]     |
   |                                    |
 [------------- tty driver ---------------]

(上記では、tty fdが読み取りと書き込みの両方で開いていると仮定しています。これは私が作業しているLinuxシステムの場合であるため、実際にstdinに書き込むかstdin fdをstdoutにコピーすることができます。読み取り/書き込み専用モードで開くと機能しません。ではありません。Linuxパイプは常に一方向であり、読み取りと書き込みの終わりが異なります。

おすすめ記事