2012-03-29 104 views

回答

13

没什么。 Python本身并没有为它注册信号处理程序。您可以在交互式解释检查:

>>> import signal 
>>> signal.signal(signal.SIGTERM, signal.SIG_DFL) 
0 
>>> signal.SIG_DFL 
0 

这表明signal.signal()返回signal.SIG_DFL为signal.SIGTERM。与signal.SIGINT对比吧,这确实有一个缺省的信号处理器(这引起了KeyboardInterrupt):

>>> signal.signal(signal.SIGINT, signal.SIG_DFL) 
<built-in function default_int_handler> 
+4

这也意味着如果进程被SIGTERM终止,那么通过'atexit.register()'注册的函数将不会被调用。 – 2012-03-29 18:16:55

+5

好吧,但它做什么?不干净地退出?完全忽略它?还有别的吗? – Lucretiel 2016-05-06 21:09:37

5

大厦托马斯武泰的答案,Python不注册SIGTERM信号的处理程序。我们可以这样做:

In[23]: signal.SIG_DFL == signal.signal(signal.SIGTERM,signal.SIG_DFL) 
Out[23]: True 

这意味着系统将采取默认操作。在linux上,SIGTERM的默认操作(根据the signal man page)是终止进程。

终止进程意味着:

  • 过程将简单地不被分配在此期间,它可以执行代码的任何更多的时间片。

    • 这意味着它不会引发异常,或调用代码尝试:最后:块,或上下文管理的出口方法。它不会做那些事情,因为那个特殊的Python解释器永远不会有机会执行另一条指令。
  • 进程的内存和其他资源(打开的文件,网络套接字等等)将被释放回系统的其余部分。

+0

这是真实的,重要的,至少对我来说是不直观的。我认为context-managers的finally子句和\ exit_方法的整个业务是确保所运行的代码始终运行(除了我知道的SIGKILL在系统级别上处理)。用这个挣扎了好几天,直到现在才意识到你已经在你的答案中提出了这个问题。我需要牢记这一点。 – matlehmann 2017-03-24 11:12:57