サブプロセスのデフォルトのstdinとstdoutは何ですか?

サブプロセスのデフォルトのstdinとstdoutは何ですか?

子プロセスのデフォルトのstdinとstdoutが何であるかを知りたいです(そのデフォルトがある場合)。子プロセスのstdinとstdoutは親プロセスと同じですか?これは両親から受け継がれたものですか、それとも親が決めたものですか?それとも、子プロセスのstdinとstdoutが親プロセスのstdinとstdoutに挿入されていますか?

私の理解では、親と子はパイプされず、最初に複製されるので、子のstdinとstdoutが親のものとまったく同じであると仮定していますが、わかりません。

たとえば、bashログインシェルとして実行される端末から入力すると、shキーボード用のstdinと端末画面用のstdoutを持つサブシェルプロセスが作成されるため、親プロセスと同じです。子供のstdinとstdoutがどのように定義されているのかを理解したいと思います。

たとえば、この場合、子のstdinとstdoutが親の標準入力と同じかどうかを知りたいと思います。これは、親の stdin が子の stdin にパイプされ、親が入力を子に「リダイレクト」するためです。 、または子供がキーボードから直接入力を受け取った場合。

同じ状況で、親と子が同じ標準入力を持っている場合、親は子に入力した同じコマンドを処理するという意味ですか?端末で子の標準入力/出力のみが表示され、親の標準入力/出力が表示されないのはなぜですか?

ベストアンサー1

fork(2) のマニュアルページを参照してください。子プロセスは、標準入力と標準出力を含む親プロセスのファイル記述子を継承します。単一コマンドの場合、シェルは単に子プロセスがこれらの記述子を継承し、その出力を端末に書き込むことを許可します。パイプの場合は、各プロセスを分岐し、あるプロセスの出力と次のプロセスの入力の間にパイプを作成し、各サブプロセスの実行可能ファイルを実行(exec(2))します。

おすすめ記事