我正在编写一个交互式Python CLI工具。当提出特定信号时,我想让工具进入“特殊文本输入模式”。我目前正确处理SIGINT并优雅退出。
问题:
答案 0 :(得分:0)
POSIX指定了两个用户定义的信号:
SIGUSR1 = 30
SIGUSR2 = 31
这两个信号不会被任何操作触发,这意味着您可以为这些信号明确定义处理程序并为您的目的提升这些信号。
import signal
def handler(signum):
if signum == signal.SIGUSR1:
print('user defined interrupt!')
signal.signal(signal.SIGUSR1, handler)
这些信号是为了用户的目的而明确提供的,因此在您的应用中提高和处理这些信号是个好主意。
要使用代码显式提升此信号,您必须使用:
import os
os.kill(os.getpid(), signal.SIGUSR1)
其中os.getpid()
返回当前进程的进程ID。将其替换为您要杀死的进程的ID(如果它不是当前进程的ID)。
另外,我应该提到Windows中不支持SIGUSR1/2
。该文档提到除了SIGABRT
,SIGFPE
,SIGILL
,SIGINT
,SIGSEGV
或SIGTERM
之外,不会提出其他信号。在任何其他情况下都会引发ValueError。
答案 1 :(得分:0)
您应该使用标准库中的signal
。 Here就是一个例子。
通常,您为特定信号指定处理程序,即:
import signal
import time
import sys
def handler(signum, frame):
print(signum, frame)
sys.exit(1)
signal.signal(signal.SIGINT, handler)
while True:
time.sleep(1)
因此,当您按下C-c时,handler
以信号编号和当前堆栈帧作为参数运行(如果您不退出,则程序继续执行)。您可以以相同的方式捕获其他信号(signal.SIGHUP等)。
例如,要处理用户保留的信号,您可以使用signal.signal(signal.SIGUSR1, handler)
,然后使用终端中的kill -USR1 <pid>
。