在python中处理信号的工作流程是什么?我设置了一个信号处理程序,当信号出现时,python如何调用我的函数?操作系统是否像C程序一样调用它? 如果我在python的C扩展中,是否会立即中断?
现在我很清楚python进程如何处理信号。当您通过信号模块设置信号时,模块将注册一个函数signal_handler(参见$ src / Modules / signalmodule.c),它设置您的处理程序并将其标记为1(Handlers[sig_num].tripped = 1;
),然后调用Py_AddPendingCall告诉python解释器。 python解释器将调用Py_MakePendingCalls来调用PyErr_CheckSignals,它在main循环中调用你的函数(参见$ src / Python / ceval.c)。
如果你想谈谈这个,请与我沟通:renenglish@gmail.com
答案 0 :(得分:6)
如果使用信号模块设置Python代码信号处理程序,解释器只会在重新进入字节码解释器时运行它。处理程序不会立即运行。当信号发生时,它被置于队列中。如果代码路径当前在C代码,内置或扩展模块中,则处理程序将延迟,直到C代码将控制权返回给Python字节代码解释器。这可能是很长一段时间,你无法真正预测多久。
最值得注意的是,如果您使用启用了readline的交互模式,那么在您给出一些要解释的输入之前,您的信号处理程序将无法运行。这是因为输入代码在readline库(C代码)中,并且在它有完整的行之前不会返回到解释器。
答案 1 :(得分:0)
看看signal module。如果你向python脚本调用一个信号,根据我的理解,如果有一个处理程序,它将首先处理该信号,并可能处理和忽略某些信号。即。您可以尝试在杀死之前执行一些关闭清理工作,而不是在SIGKILL上执行死亡。