ターミナルエミュレータウィンドウを閉じるとbashプロセスが終了し、SIGHUPトラップが終了しないように変更されるのはなぜですか?

ターミナルエミュレータウィンドウを閉じるとbashプロセスが終了し、SIGHUPトラップが終了しないように変更されるのはなぜですか?

lxterminalターミナルエミュレータウィンドウのbashシェルで、次のコマンドを実行します。

$ trap "echo hello" SIGHUP 
$ kill -s HUP $$
hello
$

その後、端末エミュレータウィンドウを閉じます。

ターミナルエミュレータウィンドウを閉じると、SIGHUPは制御プロセス(bashプロセスなど)にのみ送信されますか?

SIGHUPトラップはbashプロセスを終了しないため、bashプロセスは終了しないと予想しましたが、実際にbashプロセスが終了したのはなぜですか?

トラップを(無視)に変更しても""同じことが起こります。

端末エミュレータが重要です。 xtermウィンドウで実行されているbashで""xtermウィンドウを閉じることができないようにトラップを設定し、同時にecho helloxtermウィンドウを閉じるようにトラップを設定します。

ありがとうございます。

ベストアンサー1

[他の端末エミュレータの実際の可能な動作は無視されます。^Dウィンドウを閉じてptyで実行されているプロセスに次のものを受け取らせるのではなく、ptyに()を送信するのは完全に合理的な動作です。家庭VEOFWM_DELETE_WINDOWSIGHUPxterm、この場合はSIGHUPシェルのプロセスグループに送信します。

あなたが見ている動作は、readlineライブラリが独自のシグナルハンドラをインストールするために発生します。以下を試してみると:

xterm -e bash --noediting

(またはdashzshまたはksh代わりにbash --noediting)次に実行します。

trap 'echo HUP' HUP

端末でウィンドウを閉じることができなくなります。HUPウィンドウを強制的に閉じようとすると、シェルがxkill予想されますEIO

以下は、観測中の動作のより簡単なテストケースで、端末エミュレータは含まれていません。端末で次のコマンドを実行します。

bash --rcfile <(echo 'trap "echo HUP" HUP')

その後、kill -HUP $$単に印刷されますHUP。ただし、(sleep 1; kill -HUP $$) &(またはkill -HUP <pid>別のウィンドウで)次に起動しないと、シェルは印刷され終了しますexit--noediting= readlineを使用しません)。

readline()呼び出された関数は、ユーザーbash入力を待っている間に独自のシグナルハンドラーをインストールし、ユーザー入力を待っている間に戻って元のSIGHUPハンドラーを復元します。これはreturnとしてNULL扱われますEOFbashyy_readline_get()関数)遅延トラップハンドラを実行する機会がある前に。

おすすめ記事