2011-06-21 114 views
5

在Python中处理信号的工作流程是什么?我设置了一个信号处理程序,当信号发生时,python如何调用我的函数?操作系统是否像C程序一样调用它? 如果我在python的C扩展中,它会立即中断吗?python如何处理信号?


现在很清楚python过程如何处理信号。当您通过信号模块设置信号时,模块将注册一个函数signal_handler(请参阅$ src/Modules/signalmodule.c),该函数设置您的处理程序并将其标记为1(Handlers[sig_num].tripped = 1;),然后调用Py_AddPendingCall以告知python解释器。 python解释器将调用Py_MakePendingCalls来调用PyErr_CheckSignals,它在主循环中调用你的函数(参见$ src/Python/ceval.c)。 沟通我,如果你想谈谈这个:[email protected]

回答

6

如果您使用信号模块设置Python代码信号处理程序,则解释程序将只在重新进入字节代码解释程序时运行它。处理程序不会马上运行。当信号发生时它被放入队列中。如果代码路径当前是C代码,内置模块或扩展模块,则处理程序将推迟到C代码将控制权返回给Python字节代码解释器。这可能需要很长时间,而且你无法真正预测多久。

最值得注意的是,如果您在使用readline的情况下使用交互模式,那么您的信号处理程序将不会运行,直到您给它一些解释输入为止。这是因为输入代码位于readline库(C代码)中,并且直到它具有完整的行才返回到解释器。

+0

所以python解释器处理信号并调用我的函数。我想知道这是如何发生的。我读了ignalmodule.c,python funcs被追加到数组中,PyErr_CheckSignals调用了被触发的函数。但是,当OS发送信号时,PyErr_CheckSginals会被调用到什么位置? – renenglish

+0

当OS发送信号时不会调用它。当信号处理程序可以运行时,例如在打印,读取用户输入等时,在解释程序的各个位置显式调用它。它运行中断处理程序队列。 – Keith

+0

Thx非常!现在,我很清楚python进程如何处理信号。当您通过信号模块设置信号时,模块将注册一个函数signal_handler(请参阅$ src/Modules/signalmodule.c),该函数设置您的处理程序并将其标记为1(Handlers [sig_num] .tripped = 1;),然后调用Py_AddPendingCall来告诉python解释器。 python解释器将调用Py_MakePendingCalls来调用PyErr_CheckSignals,它在邮件循环中调用你的函数(参见$ src/Python/ceval.c)。 – renenglish

0

看看signal module。如果你调用一个python脚本的信号,从我的理解是否有一个处理程序,它会首先处理该信号,并有可能处理和忽略某些信号。即。而不是在SIGKILL上查杀,你试图在杀死之前执行一些关闭清理工作。