我需要在我的代码中临时安装自定义信号处理程序。之后,我需要将控制权恢复到原始信号处理程序。我之前在其他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
功能。