
答え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パイプは常に一方向であり、読み取りと書き込みの終わりが異なります。
答え2
パイプを使用しないとします。最初のプロセスは書くことができます標準出力。 2番目のプロセスは読むことができます標準入力。
とても簡単に閉じることができます。標準入力2番目のプロセス。アクセスするには何を開く必要がありますか?標準出力最初のコースは? (ヒント:できません。)
したがって、書き込みと読み取りのために開くことができるよく知られたエンドポイントを持つパイプを作成します。