如何避免在Python中重写信号处理程序?
我的实验代码如下:如何避免在Python中重写信号处理程序?,python,signals,Python,Signals,我的实验代码如下: import signal def hi(signum, frame): print "hi" signal.signal(signal.SIGINT, hi) signal.signal(signal.SIGINT, signal.SIG_IGN) hi未打印,因为信号处理程序被signal.SIG\u IGN覆盖 如何避免这种情况?如果您不想覆盖自己的处理程序,请检查是否设置了一个: if signal.getsignal(signal.SIGINT) in
import signal
def hi(signum, frame):
print "hi"
signal.signal(signal.SIGINT, hi)
signal.signal(signal.SIGINT, signal.SIG_IGN)
hi
未打印,因为信号处理程序被signal.SIG\u IGN
覆盖
如何避免这种情况?如果您不想覆盖自己的处理程序,请检查是否设置了一个:
if signal.getsignal(signal.SIGINT) in [signal.SIG_IGN, signal.SIG_DFL]:
signal.signal(signal.SIGINT, hi)
根据,可能某个上级进程已经从默认值重新分配了处理程序。如果不想覆盖该选项,请将None
添加到信号列表中
signal.signal(…,signal.SIG\u IGN)
的明显包装将是不在测试中
在回复评论时添加
链接信号处理程序并不常见,因为信号非常细粒度。如果我真的想这样做,我会遵循和注册处理程序调用的函数的模型。您可以尝试检查是否已经有处理程序。如果是这样,请将所需的处理程序和旧处理程序放入一个包装函数中,该包装函数将同时调用它们
def append_signal(sig, f):
old = None
if callable(signal.getsignal(sig)):
old = signal.getsignal(sig)
def helper(*args, **kwargs):
if old is not None:
old(*args, **kwargs)
f(*args, **kwargs)
signal.signal(sig, helper)
只需执行与C中相同的操作:
sig_hand_prev = None
def signal_handler(signum, frame):
...
signal.signal(signum, sig_hand_prev)
os.kill(os.getpid(), signum)
def install_handler(signum):
global sig_hand_prev
sig_hand_prev = signal.signal(signum, signal_handler)
这里的关键思想是,您只保存上一个处理程序,并在完成任务后再次提升它。通过这种方式,信号处理是一个单链表OOB。如果有一个内置的信号默认处理程序,如signal.default\u int\u handler
,这将失败,因为signal.default\u int\u handler
引发KeyboardInterrupt
,新附加的处理程序将不会执行。解决方法是捕获处理程序中的所有异常,并在某个地方打印错误。(这就是我在类似场景中看到的情况)。你的情况会有问题吗?先给你的打电话就行了