我正在学习信号处理程序。我编写了一个简单的 python 脚本来处理和打印它收到的所有信号。然后我通过在远程计算机上运行该脚本ssh
。然后,当我发送 Ctrl C 信号时,远程进程会按预期中断。相反,当我发送 Ctrl Z 信号时,远程进程不会像我预期的那样停止。
首先,我认为 Ctrl Z 可能无法到达远程脚本。但是当我挂接自定义处理程序时,它检测到正在发送 Ctrl Z。
然后我想可能是 Ctrl Z 被进程忽略了。但是当我打印 SIGTSTP 的当前处理程序时,我希望得到 SIG_IGN。但它是 SIG_DFL(对于 SIGTSTP 来说意味着停止进程)。
谁能解释这种行为?
运行 ssh 的命令:
ssh ubuntu16x64-1 -t 'python3 ~/sig_check.py'
签名检查 python 脚本:
#! /usr/bin/python3
import signal, errno
import time, os, sys
all_sigs = list(signal.Signals)
open('sig_log.txt', 'w').close()
def print_sig(num, frame):
with open('sig_log.txt', 'a') as f:
f.write('{}\n'.format(num))
print(num)
for sig in all_sigs:
if sig == 20: # SIGTSTP
print(sig, signal.getsignal(sig))
continue # commenting this would set handler for Ctrl Z
try:
signal.signal(sig, print_sig)
except OSError:
print('OSerr: Skipping %s' % (sig))
except ValueError:
print('Valerr: Skipping %s' % (sig))
print("Process pid %d" % (os.getpid()))
print("Parent pid %d" % (os.getppid()))
while True:
time.sleep(2)
pass
编辑:埋在最后一段这页面上,我发现了一种可能发生这种情况的情况。也就是说,当接收 SIGTSTP 的进程位于孤立进程组中时。但我不确定这个案例是否属于该类别。