lxterminalのターミナルエミュレータウィンドウのbashシェルで、
$ trap "echo hello" SIGHUP
$ kill -s HUP $$
hello
$
次に、ターミナルエミュレータウィンドウを閉じます。
ターミナルエミュレータウィンドウを閉じると、SIGHUPが制御プロセス(bashプロセス)に送信されるだけですか?
SIGHUPトラップはbashプロセスを終了しないので、bashプロセスは終了しないと思いますが、なぜbashプロセスが実際に終了するのですか?
トラップを""
(無視)に変更しても同じことが起こります。
ターミナルエミュレータが重要です。xtermウィンドウで実行されているbashでは、trapをに設定する""
とxtermウィンドウecho hello
が閉じられなくなりますが、trapをに設定するとxtermウィンドウを閉じることができます。
ありがとう。
[さまざまなターミナルエミュレータの実際の動作と考えられる動作は無視します。完全に合理的な動作は、ウィンドウを閉じて/を閉じるptyに^D
(VEOF
)を送信するWM_DELETE_WINDOW
ことです。これを破棄して、その中で実行されているプロセスにSIGHUP
;を受信させるのではありません。以下はxterm
、を想定しておりSIGHUP
、その場合はシェルのプロセスグループにを送信します]。
表示されている動作readline
は、独自のシグナルハンドラーをインストールしているライブラリが原因です。次のことを試してみてください。
xterm -e bash --noediting
(またはdash
、zsh
またはのksh
代わりにbash --noediting
)、次に実行します
trap 'echo HUP' HUP
ターミナルでは、ウィンドウを閉じることができなくなります。HUP
ウィンドウを閉じようとすると、シェルは期待どおりに出力されます。強制的に閉じると(たとえば、を使用してxkill
)、シェルがEIO
エラーで終了します。これは、ptyが破棄されたため、完全に予想されます。
これは、ターミナルエミュレーターを含まない、観察している動作のより簡単なテストケースです。ターミナルで以下を実行します。
bash --rcfile <(echo 'trap "echo HUP" HUP')
次に、kill -HUP $$
印刷するだけですHUP
が、(sleep 1; kill -HUP $$) &
(またはkill -HUP <pid>
別のウィンドウから)シェルを印刷exit
して終了します。ただし、--noediting
(= readlineを使用しないでください)で開始した場合を除きます。
readline()
呼び出される関数はbash
、ユーザからの入力を待っている時に、独自のシグナルハンドラをインストールし、そして戻ると、元のハンドラを復元します。SIGHUP
ユーザからの入力を待っている間は、それが返されますNULL
として扱わされる、EOF
によってbash
(中yy_readline_get()
繰延トラップハンドラを実行する機会を持つ前に、機能)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加