lxterminalターミナルエミュレータウィンドウのbashシェルで、次のコマンドを実行します。
$ trap "echo hello" SIGHUP
$ kill -s HUP $$
hello
$
その後、端末エミュレータウィンドウを閉じます。
ターミナルエミュレータウィンドウを閉じると、SIGHUPは制御プロセス(bashプロセスなど)にのみ送信されますか?
SIGHUPトラップはbashプロセスを終了しないため、bashプロセスは終了しないと予想しましたが、実際にbashプロセスが終了したのはなぜですか?
トラップを(無視)に変更しても""
同じことが起こります。
端末エミュレータが重要です。 xtermウィンドウで実行されているbashで""
xtermウィンドウを閉じることができないようにトラップを設定し、同時にecho hello
xtermウィンドウを閉じるようにトラップを設定します。
ありがとうございます。
ベストアンサー1
[他の端末エミュレータの実際の可能な動作は無視されます。^D
ウィンドウを閉じてptyで実行されているプロセスに次のものを受け取らせるのではなく、ptyに()を送信するのは完全に合理的な動作です。家庭VEOF
WM_DELETE_WINDOW
SIGHUP
xterm
、この場合はSIGHUP
シェルのプロセスグループに送信します。
あなたが見ている動作は、readline
ライブラリが独自のシグナルハンドラをインストールするために発生します。以下を試してみると:
xterm -e bash --noediting
(またはdash
、zsh
または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
扱われますEOF
。bash
yy_readline_get()
関数)遅延トラップハンドラを実行する機会がある前に。