Py3k/Python で書かれたシェルにシグナル ハンドラを追加するにはどうすればよいですか? 、動作しているように見えるシグナルハンドラーがあり、デフォルトのアクションを通過させました。具体的な例として、control-Z を押すと、シグナル ハンドラーによって指定されたメッセージが表示され、(望ましくない) プロセスが中断されます。
どのように (可能であれば) メッセージを表示し、それ以外の場合はシグナルを無視しますか?
Py3k/Python で書かれたシェルにシグナル ハンドラを追加するにはどうすればよいですか? 、動作しているように見えるシグナルハンドラーがあり、デフォルトのアクションを通過させました。具体的な例として、control-Z を押すと、シグナル ハンドラーによって指定されたメッセージが表示され、(望ましくない) プロセスが中断されます。
どのように (可能であれば) メッセージを表示し、それ以外の場合はシグナルを無視しますか?
キーを押すSIGSTOPと、SIGSTP. ターミナルで実行stty -aして、に割り当てられている正確なシグナルを決定しctrl+zます。
ウィキペディア(およびおそらくマニュアルページも)によるSIGSTPと、 とSIGSTOPは異なります。
SIGSTPはプロセスに送信されるため傍受できますがSIGSTOP、OS によって取得されるため傍受できません。
CTRL-Z は合図ではなく、キーの組み合わせです。Windows では、CTRL-Z はEOFを送信しますが、これもシグナルではありません。ほとんどの Unix シェルは CTRL-Z でシグナル、つまり SIGTSTP シグナルを送信するため、Unix を意味していると思います。
SIGTSTP のハンドラを変更するとうまくいきます:
>>> import signal
>>> def handler(signum, frame):
... print(signum, frame, "yay!")
...
>>> signal.signal(signal.SIGTSTP, handler)
0
<Here I press CTRL-Z>
>>> 20 None yay!