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

ティム

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に^DVEOFを送信するWM_DELETE_WINDOWことです。これを破棄して、その中で実行されているプロセスにSIGHUP;を受信させるのではありません。以下はxterm、を想定しておりSIGHUP、その場合はシェルのプロセスグループにを送信します]。

表示されている動作readlineは、独自のシグナルハンドラーをインストールしているライブラリが原因です次のことを試してみてください。

xterm -e bash --noediting

(またはdashzshまたはの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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ