我有一个脚本,我试图为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()发布于 2014-10-18 03:42:41
根据the documentation的说法,p4api有一个名为Signaler的类,用于“中断处理”:
API类使
程序员能够注册当客户端应用程序接收到中断信号时要调用的函数。
Signaler类维护一个已注册函数的列表,并依次调用每个函数。
默认情况下,在执行完所有已注册的函数后,进程退出,并将-1返回给操作系统。
大概是在你import p4api的时候安装的。因此,您的信号处理程序正在干扰它的信号处理程序,最终它会窃取信号,并在您有机会做任何有用的事情之前调用_exit(-1)或类似的函数。
您可以找到详细的here,但看起来Signaler::OnIntr是您想要调用以注册其信号处理程序的函数的C++名称。文档中也有示例代码。第一个谷歌搜索结果是this C++ source,这很清楚地表明这是正确的。
我在Python API docs中看不到任何东西,我不知道Python API是C++ API的包装器,还是一个单独的实现,但无论哪种方式,我猜它有一个同名的类,您必须以相同的方式使用它。
https://stackoverflow.com/questions/26431643
复制相似问题