子プロセスのデフォルトのstdinとstdoutが何であるかを知りたい(そのようなデフォルトがある場合)。子プロセスのstdinとstdoutは親プロセスと同じですか?これは親から継承されたものですか、それとも親によって設定されたものですか?または、子プロセスのstdinとstdoutが親プロセスのstdinとstdoutに接続されていますか?
私の理解では、親と子はパイプされていませんが、最初はクローンなので、子のstdinとstdoutは親とまったく同じだと思いますが、わかりません。
たとえば、ログインシェルとしてbash
を実行している端末でsh
と入力すると、子シェルプロセスが作成され、キーボードが標準入力され、端末画面が標準出力されるため、同じその親として。子のstdinとstdoutがどのように定義され、それらが何であるかを理解したいと思います。
たとえば、この場合、子のstdinおよびstdoutが親のものと同じであるかどうかを知りたいキーボードから直接入力します。
同じケースで、親と子が同じstdinを持っている場合、それは親が子に入力された同じコマンドを処理することを意味しますか?ターミナルで子のstdin/outのみが表示され、親の子は表示されないのはなぜですか?
Fork(2)のmanページを見てください。子プロセスは、標準入力と標準出力を含む親のファイル記述子を継承します。単一のコマンドの場合、シェルは子プロセスにそれらの記述子を継承させ、その出力を端末に書き込むだけです。パイプラインの場合は、各プロセスをフォークし、1つの出力と次の入力の間にパイプを設定してから、各子の実行可能ファイルを実行(exec(2))します。
前の答えは正しいですが、私はあなたがさらに進んでstraceの使用方法を学ぶことをお勧めします。 straceはプロセスにアタッチし、プロセスが端末に対して行っている各システムコールを出力します。これは非常に教育的で、多分少し圧倒されるかもしれません。各システムコールにはmanページがあり、プログラムが実行するすべての小さなアクションが詳細に表示されます。問題のあるプロセスのデバッグに非常に役立ちます。