Python:如何将控制权返回到从C注册的原始信号处理程序?

时间:2017-07-19 05:09:32

标签: python signals handler lldb

我需要在我的代码中临时安装自定义信号处理程序。之后,我需要将控制权恢复到原始信号处理程序。我之前在其他StackOverflow答案中看过以下内容:

# Save original signal handler
original_SIGINT_handler = signal.getsignal(signal.SIGINT)

# Install the new SIGINT handler
signal.signal(signal.SIGINT, handle_SIGINT)

# do stuff

# Return control to original signal handler
signal.signal(signal.SIGINT, original_SIGINT_handler)

但是,如果原始信号处理程序是从C注册的,这将不起作用。根据https://pymotw.com/2/signal/,如果原始信号处理程序是从C注册的,signal.getsignal(signal.SIGINT)将返回None。然后,当我们使用signal.signal(signal.SIGINT, None)恢复信号时,代码将失败:

TypeError: signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object

我如何安装临时信号处理程序,如果原件是在C中定义的那么开始?

是否可以将“附加”功能添加到现有的信号处理程序中?鉴于this other StackOverflow answer,我觉得可能有一种hacky方法,因为显然Python信号处理程序运行在C信号处理程序返回之后。

对于更多上下文,我正在编写一个lldb Python脚本,我需要在我的脚本中暂时捕获ctrl+c,我正在通过临时安装我自己的SIGINT处理程序来完成。离开我的脚本时,我需要恢复ctrl+c定义的原始lldb功能。

0 个答案:

没有答案