2012-03-29 45 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