Gilesの答えを理解するならさまざまな信号が送信される原因は何ですか?そうですね。端末で実行されるシェルプロセスのジョブ制御に関連するいくつかの信号があります。
キー押下通知:SIGINT、SIGQUIT、SIGTSTP
SIGSTOP、SIGCHLD、SIGCONT、
SIGTTINとSIGTTOU
SIGWINCHとSIGHUP。
どの端末関連信号が最初に端末のシェルプロセスに到達するのではなく、シェルのサブプロセスに直接送信されるのか、どの端末関連信号が最初に端末のシェルプロセスに送信され、シェルがサブプロセスに再送信されるのかを知りたいです。
たとえば、最も一般的に使用されている2つのシグナルについて、次は正しいですか?
SIGHUPは最初にシェルプロセスに送信され、次にフォアグラウンドまたはバックグラウンドにあるかどうかnohup
にかかわらず(つまり、違いを作成できる場合)、シェルのすべてのサブプロセスに再送信されます。
Ctrl-C を押すと SIGINT に該当する内容は次のとおりです。
ターミナルドライバは、ターミナルで実行されている親シェルプロセスではなく、前景グループのプロセスにのみSIGINTを送信します。したがって、親シェルプロセスはSIGINTを処理する必要はありません。
ターミナルドライバはターミナルで実行されているシェルプロセスにSIGINTを送信し、シェルプロセスはそれをフォアグラウンドグループのプロセスに送り返し、SIGINTを処理します。
Stéphane Chazelasの答えを理解したらhttps://unix.stackexchange.com/a/384702/674はい、最初は正しいですか?
ありがとうございます!
ベストアンサー1
対話型シェルのフォアグラウンドでジョブを実行すると、そのジョブ(該当するプロセスグループ)のプロセスのみがSIGINT(シェルではなくカーネルから送信)を受け取ります^C
。
実行中のフォアグラウンドタスクがない場合、つまりプロンプトでは、シェルはコマンドライン入力を待っている間フォアグラウンドにあります。したがって、キーを押すと^C
SIGINT信号がシェルに送信されます。シェルは通常、現在入力されているテキストをキャンセルとして処理し、キーまたは完成ウィジェットの一部として呼び出されたコマンドを終了することもできます。ここに独自のハンドラを追加することもできます。
ノート
1他のコマンドも並行して実行されるスクリプトの一部としてシェルが起動した場合、他のプロセスが同じプロセスグループに存在する可能性があります。インタラクティブシェルは起動時に独自の新しいプロセスグループを作成しようとします(それを前景プロセスグループに設定します)、そのプロセスがすでにプロセスグループリーダーである場合はそうしない可能性があります。これにより:
bash -c ': <(sleep 1000); exec bash'
その後、Ctrl+Cそのシェルのプロンプトをクリックすると、シェルも終了することbash
がわかります。sleep
sleep
次のように実行すると観察されません。
sh -c 'sleep 1000 & exec bash'
この場合、sh
非同期コマンドのSIGINTは明示的に無視されますsleep
(SIGINT処理は実行前にSIGIGNに設定されますsleep
)。