如何避免在 Python 中覆盖信号处理程序?

sat*_*oru 5 python signals

我的实验代码是这样的:

import signal

def hi(signum, frame):
    print "hi"

signal.signal(signal.SIGINT, hi)
signal.signal(signal.SIGINT, signal.SIG_IGN)
Run Code Online (Sandbox Code Playgroud)

hi没有被打印,因为信号处理程序被signal.SIG_IGN.

我怎样才能避免这种情况?

msw*_*msw 2

如果您不想覆盖自己的处理程序,请检查您是否已设置:

if signal.getsignal(signal.SIGINT) in [signal.SIG_IGN, signal.SIG_DFL]:
    signal.signal(signal.SIGINT, hi)
Run Code Online (Sandbox Code Playgroud)

根据文档,某些高级进程可能已经从默认值重新分配了处理程序。如果您不想覆盖它,请添加None到信号列表中。

明显的包装signal.signal(..., signal.SIG_IGN)将是一个not in测试。

添加以回复评论

由于信号是如此精细,因此链接信号处理程序并不常见。如果我真的想这样做,我会遵循atexit模型并注册由处理程序调用的函数。