我有一个脚本,我试图为ctr-c添加一个信号处理程序,在退出之前做一些最后的处理。
就它本身而言,它运行正常,但一旦我在我的程序中尝试它,它就不起作用。添加或删除导入似乎会改变行为。
没有P4API导入,它可以正常工作。如果我导入P4API,ctr-c似乎调用exit或绕过我的处理程序,我不知道为什么,或者如何跟踪正在改变的内容。
import signal
import time
import sys
# -- with this commented out, things work
#import P4API
def run_program():
while True:
time.sleep(1)
print("a")
def exit_gracefully(signum, frame):
# restore the original signal handler as otherwise evil things will happen
# in raw_input when CTRL+C is pressed, and our signal handler is not re-entrant
signal.signal(signal.SIGINT, original_sigint)
try:
if raw_input("\nReally quit? (y/n)> ").lower().startswith('y'):
sys.exit(1)
except KeyboardInterrupt:
print("Ok ok, quitting")
sys.exit(1)
# restore the exit gracefully handler here
signal.signal(signal.SIGINT, exit_gracefully)
if __name__ == '__main__':
# store the original SIGINT handler
original_sigint = signal.getsignal(signal.SIGINT)
signal.signal(signal.SIGINT, exit_gracefully)
run_program()
答案 0 :(得分:1)
根据the documentation,p4api有一个名为Signaler
的类,它用于"中断处理":
Signaler
类使API程序员能够注册在客户端应用程序收到中断信号时要调用的函数。Signaler
类维护已注册函数的列表,并依次调用每个函数。默认情况下,在执行完所有已注册的函数后,进程退出,返回-1到操作系统。
据推测,当你import p4api
时会安装它。因此,您的信号处理程序正在干扰其信号处理程序,最终它会在您有机会做任何有用的事情之前窃取信号并调用_exit(-1)
或类似信号。
您可以找到详细信息here,但看起来Signaler::OnIntr
是您要调用以向其信号处理程序注册的函数的C ++名称。文档中也有示例代码。第一个Google搜索结果为我提供了this C++ source,这非常清楚,这是正确的。
我在Python API docs中看不到任何内容,我也不知道Python API是否是C ++ API的包装器,或者是单独的实现,但无论如何我都是&#39 ;我猜它有一个类似名称的类,你必须以同样的方式使用。