プログラムを実行した後、bashはバックグラウンドで何をしますか?

プログラムを実行した後、bashはバックグラウンドで何をしますか?

ターミナルの入力は、bashプロセスを介して現在実行されているプログラムにルーティングされますか、またはターミナルはbashプロセスで「接続が切断されて」新しいプログラムに接続され、bashが傍受または干渉するのを防ぎますか?

Bashはバックグラウンドで停止してプログラムの終了を待っていますか、それとも何かをしていますか?

ターミナルウィンドウを閉じるときにbashにシグナルを送信し、フォアグラウンドプロセスにシグナルを送信して閉じますか?それとも、bashまで伝播するフォアグラウンドプロセスにシグナルを送信しますか?

ベストアンサー1

ターミナルの入力は、bashプロセスを介して現在実行されているプログラムにルーティングされますか、またはターミナルはbashプロセスで「接続が切断されて」新しいプログラムに接続され、bashが傍受または干渉するのを防ぎますか?

どちらもありません。パイプやリダイレクトのない単純なフォアグラウンドコマンドを想定すると、ユーザーの入力とユーザーへの出力はbashを介してルーティングされません。しかし、bashは干渉をブロックしません。 bashは単にブロックされません。努力する干渉。

プログラムがファイルまたは端末を開くと、読み書きのためのファイル記述子を受け取ります。 子プロセスは、親プロセスのオープンファイル記述子セットのコピーを継承します。

端末に何かを入力すると、標準入力を介してプロセスに渡されます。ユーザーに書き込むときに stdout または stderr に書き込みます。 Stdin、stdout、stderr はすべて、予測可能な ID を持つファイル記述子です。 POSIX 規格に従って、それぞれ 0 1 2 に番号が付けられます。したがって、Bashがプログラムを実行すると、まず子プロセスが生成されます。クロスそして、サブプロセスは同じstdin、stdout、およびstderr FDを自動的に継承します。したがって、子は自動的にまったく同じ端末を読み書きします。

「プログラムの実行」は、以下を呼び出して実行されます。クロスそれから実装する。パイプとリダイレクトは、代替のstdin、stdout、およびstderrを呼び出すことによって実装されます。デュープ2フォークとexecveの間。

したがって、「プログラム」は bash と同じ端末で直接読み取ることができます。これはbashや他のものが同じ端末で読み書きするのを防ぎません。 Bashが実際にこれを実行しようとすると、混乱が発生する可能性があります。マルチプロセス書き込みにより、すべてが予測不可能な順序で記録される可能性があります。複数のプロセスから読み取ると、一部のバイト(キー入力)があるプロセスに移動し、他のバイトが別のプロセスに移動されます。

Bashはバックグラウンドで停止してプログラムの終了を待っていますか、それとも何かをしていますか?

効果的に凍結します。もっと正確に言えば待っている。私が知っている限り、それは明示的に呼び出されます。waitpid()またはwait3()(シェルを実行しているUnixに応じて)子プロセスが終了するのを待ちます。

ターミナルウィンドウを閉じるときにbashにシグナルを送信し、フォアグラウンドプロセスにシグナルを送信して閉じますか?それとも、bashまで伝播するフォアグラウンドプロセスにシグナルを送信しますか?

申し訳ありません。この動作はすぐには覚えていません。私はターミナル[ウィンドウ]を閉じると、通常何も読み書きしなくても実行中のプロセスを終了すると思います。私はそれがEOFを引き起こす端末の読み取りに基づいているとは信じていません。。端末の閉鎖によりシグナル。正しい答えを見つけたら、答えを修正します。

私は、子供がキーボード割り込みキーシーケンスを効果的に傍受し、bashがキーシーケンスを受信できないようにすることができることを知っています。これが信号を傍受するのか、端末が信号をすべて生成するのを防ぐのかはわかりません。

おすすめ記事