ターミナルでCtrl + Cを実行するとターミナルウィンドウを完全に閉じるプロセスがありますが、なぜこれが起こるのかを知っている人はいますか?
プロセスは次のように始まります。
exec "$(dirname "$0")/suman-shell" # a
以前に開始された方法は次のとおりです。問題ありません。
"./$(dirname "$0")/suman-shell" # b
execを使用すると、ターミナルウィンドウが閉じているように見えますが、なぜ信号を受信した後に閉じずに閉じa
ますか?b
答え1
通常、すべてのコマンド(シェル組み込みではない)はサブシェルで実行されます。つまり、基本プロセスが分岐して新しいプロセスがコマンドを実行している間、基本プロセスは通常、子プロセスが完了するのを待ちます。
これが、シグナル転送に加えて、子プロセスが基本プロセスに影響を与えることができない理由です。
組み込みシェルを使用してコマンドを実行すると、基本プロセスは分岐せずにexec
コマンドになります(syscallを介してexecve()
)。したがって、コマンドが終了した後に戻ってくる基本プロセスはありません。
ターミナルエミュレータの観点からは、シェルが終了したため(exec
コマンドが終了した後)ウィンドウが閉じます。