シェルが組み込み機能を実行し、キーボードが信号を生成するときにその信号を処理するのは何ですか?

シェルが組み込み機能を実行し、キーボードが信号を生成するときにその信号を処理するのは何ですか?

私が間違っている場合は訂正してください:Bashシェルが外部ランチャーを実行するとき、bashシェルは、フォアグラウンドでプログラムを実行するための子プロセスを生成します。キーを押して生成された信号がある場合、信号は次のようになります。送る子プロセスに処理済みプログラムに合格してください。

Bashシェルが組み込みコマンドを実行するとき、bashシェルは、シェルプロセスの組み込みコマンドをフォアグラウンドで直接実行します。どのキーを押しても生成された信号がある場合、その信号は次のようになります。送るシェルプロセスとして?これは扱う信号、プログラムの組み込みコマンド、またはbash?組み込みコマンドは独自のシグナルハンドラを持つことができますか、それともシグナルハンドラに依存する必要がありますかbash

たとえば、bashシェルがwaitフォアグラウンドで実行されているときにCtrl-Cを押すと、シェルプロセスはSIGINT信号を受け取り、waitbashで処理しますか?wait独自のシグナルハンドラがあるか、依存するシグナルハンドラがありますかbash

ありがとうございます。

答え1

シグナル、組み込みコマンドプログラム、またはbashを処理するものは何ですか?

組み込みコマンドを含むプログラムはbashです。これが組み込みの定義です。外部プログラムではなくシェルに組み込まれています。

シェルは、信号を受信したときに行われていた操作によって異なる反応をする可能性があります。しかし、他のプロセスが関係しないので、信号を受信することは常にシェルプロセスです。

答え2

/dev/tty*Linuxターミナルデバイス(、、)を理解する/dev/pts/*最も簡単な方法は、次のように考えることです。ストリーミングソケット/dev/tty12たとえば、これがTCPポートであるかのようです127.0.0.1:8080

プロセスはここに接続し、入力を受け取り、記録し、最終的には切断します。ソケット(ターミナル)は複数のプロセスと接続を確立できます。

他のプロセスは彼らの言葉を聞く、一般的にはターミナルエミュレータプログラムですが、必ずしもそうではありません。文字ターミナルの場合、Linuxカーネル自体はターミナルデバイスで「リスナーデーモン」として機能します。

端末にはあるがソケットにはない「追加機能」:カーネルは、どのプロセスが接続されているかを追跡し、必要に応じてシグナルを送信できます。。たとえば、Ctrl+を押すとcこれが発生します。

転送された信号の詳細なリストを読むことができます。そこ答え。

+を押すとCtrl正確に何が起こりますかc

これはいいえこれは、誰かがキーaなどの通常のボタンを押したのと同じです。この場合、押したキーは単に端末装置に書き込まれ、端末装置から読み取られるプロセス(通常はフォアグラウンドプロセス)によって読み取ることができます。

Ctrl+などの特殊キーを押すか、ターミナルウィンドウを閉じるかサイズ変更すると、ターミナルは要求を受け取り、zカーネルは接続されているすべてのプロセスに適切な信号を送信します。それらすべてに、後で重要になります。

ioctl()これらのデバイスは直接通話で制御することもできます。

Bashが子プロセス(つまり外部コマンド)を実行すると、次のようになります。

  1. bashはバックグラウンドでプロセスを開始し、端末に提供します。
  2. bashが端末から入力を受け取ることを停止します。
  3. プロセスが停止すると、bashはすべてを復元します。

ただし、bashはまだ端末デバイスに接続されており、Ctrl+が表示されたら信号を受信しますc。外部コマンドも信号を受信します。

ただし、これらの信号はオーバーライドできます(signal()システムsigaction()コール)。 Bashはこれをオーバーライドします。つまり、基本信号処理ルーチンを独自のルーチンで上書きします(単に停止)。そのため、コマンドプロンプトで+を押してもCtrl終了しません。c

ただし、aはsleep 60終了します。信号ハンドラは変更されません。

bash内部コマンドを実行すると、このシグナルハンドラは言うように動作します(内部コマンドの実行を停止し、プロンプトに戻ります)。

関連情報