python如何处理信号?

ren*_*ish 5 python signals extend

在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

Kei*_*ith 6

如果使用信号模块设置Python代码信号处理程序,解释器将仅在重新进入字节码解释器时运行它.处理程序不会立即运行.当信号发生时,它被置于队列中.如果代码路径当前在C代码,内置或扩展模块中,则处理程序将延迟,直到C代码将控制权返回给Python字节代码解释器.这可能是很长一段时间,你无法真正预测多久.

最值得注意的是,如果您使用启用了readline的交互模式,那么在您给出一些输入来解释之前,您的信号处理程序将不会运行.这是因为输入代码在readline库(C代码)中,并且在它有完整的行之前不会返回到解释器.