Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免在Python中重写信号处理程序?_Python_Signals - Fatal编程技术网

如何避免在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
,新附加的处理程序将不会执行。解决方法是捕获处理程序中的所有异常,并在某个地方打印错误。(这就是我在类似场景中看到的情况)。你的情况会有问题吗?先给你的打电话就行了