即使收到 Ctrl-Z 后进程也不会停止

即使收到 Ctrl-Z 后进程也不会停止

我正在学习信号处理程序。我编写了一个简单的 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 的进程位于孤立进程组中时。但我不确定这个案例是否属于该类别。

相关内容