信號的概念 信號(signal)-- 進程之間通訊的方式,是一種軟體中斷。一個進程一旦接收到信號就會打斷原來的程式執行流程來處理信號。 幾個常用信號: SIGINT 終止進程 中斷進程 (control+c) SIGTERM 終止進程 軟體終止信號 SIGKILL 終止進程 殺死進程 SIGALRM
信號的概念
信號(signal)-- 進程之間通訊的方式,是一種軟體中斷。一個進程一旦接收到信號就會打斷原來的程式執行流程來處理信號。
幾個常用信號:
SIGINT 終止進程 中斷進程 (control+c)
SIGTERM 終止進程 軟體終止信號
SIGKILL 終止進程 殺死進程
SIGALRM 鬧鐘信號
進程結束信號 SIGTERM和SIGKILL的區別
SIGTERM比較友好,進程能捕捉這個信號,根據您的需要來關閉程式。在關閉程式之前,您可以結束打開的記錄文件和完成正在做的任務。在某些情況下,假如進程正在進行作業而且不能中斷,那麼進程可以忽略這個SIGTERM信號。
對於SIGKILL信號,進程是不能忽略的。這是一個 “我不管您在做什麼,立刻停止”的信號。假如您發送SIGKILL信號給進程,Linux就將進程停止在那裡。
發送信號一般有兩種原因:
1(被動式) 內核檢測到一個系統事件.例如子進程退出會像父進程發送SIGCHLD信號.鍵盤按下control+c會發送SIGINT信號
2(主動式) 通過系統調用kill來向指定進程發送信號
操作系統規定了進程收到信號以後的預設行為
但是,我們可以通過綁定信號處理函數來修改進程收到信號以後的行為
有兩個信號是不可更改的SIGTOP和SIGKILL
綁定信號處理函數:
import os import signal from time import sleep def onsignal_term(a,b): print '收到SIGTERM信號' #這裡是綁定信號處理函數,將SIGTERM綁定在函數onsignal_term上面 signal.signal(signal.SIGTERM,onsignal_term) def onsignal_usr1(a,b): print '收到SIGUSR1信號' #這裡是綁定信號處理函數,將SIGUSR1綁定在函數onsignal_term上面 signal.signal(signal.SIGUSR1,onsignal_usr1) while 1: print '我的進程id是',os.getpid() sleep(10)
運行該程式。然後通過另外一個進程來發送信號。
發送消息的代碼如下:import os import signal #發送信號,16175是前面那個綁定信號處理函數的pid,需要自行修改 os.kill(16175,signal.SIGTERM) #發送信號,16175是前面那個綁定信號處理函數的pid,需要自行修改 os.kill(16175,signal.SIGUSR1)
使用信號需要特別註意的地方:
如果一個進程收到一個SIGUSR1信號,然後執行信號綁定函數,第二個SIGUSR2信號又來了,第一個信號沒有被處理完畢的話,第二個信號就會丟棄。
所以,儘量不要在多線程中使用信號。
這個不妥,測試沒發現有信號丟失
例子演示:
接收信號的程式,你會發現如果有另外一端使用多線程向這個進程發送信號,會遺漏一些信號。