訊號(signal)-- 程序之間通訊的方式,是一種軟體中斷。乙個程序一旦接收到訊號就會打斷原來的程式執行流程來處理訊號。
幾個常用訊號:
sigint 終止程序 中斷程序 (control+c)
sigterm 終止程序 軟體終止訊號
sigkill 終止程序 殺死程序
sigalrm 鬧鐘訊號
sigterm比較友好,程序能捕捉這個訊號,根據您的需要來關閉程式。在關閉程式之前,您可以結束開啟的記錄檔案和完成正在做的任務。在某些情況下,假如程序正在進行作業而且不能中斷,那麼程序可以忽略這個sigterm訊號。
對於sigkill訊號,程序是不能忽略的。這是乙個 「我不管您在做什麼,立刻停止」的訊號。假如您傳送sigkill訊號給程序,linux就將程序停止在那裡。
1(被動式) 核心檢測到乙個系統事件.例如子程序退出會像父程序傳送sigchld訊號.鍵盤按下control+c會傳送sigint訊號
2(主動式) 通過系統呼叫kill來向指定程序傳送訊號
作業系統規定了程序收到訊號以後的預設行為
但是,我們可以通過繫結訊號處理函式來修改程序收到訊號以後的行為
有兩個訊號是不可更改的sigtop和sigkill
繫結訊號處理函式:
importos
import
signal
from time import
sleep
defonsignal_term(a,b):
'收到sigterm訊號'#
這裡是繫結訊號處理函式,將sigterm繫結在函式onsignal_term上面
signal.signal(signal.sigterm,onsignal_term)
defonsignal_usr1(a,b):
'收到sigusr1訊號'#
這裡是繫結訊號處理函式,將sigusr1繫結在函式onsignal_term上面
signal.signal(signal.sigusr1,onsignal_usr1)
while 1:
'我的程序id是
',os.getpid()
sleep(10)
執行該程式。然後通過另外乙個程序來傳送訊號。
傳送訊息的**如下:
importos
import
signal
#傳送訊號,16175是前面那個繫結訊號處理函式的pid,需要自行修改
os.kill(16175,signal.sigterm)
#傳送訊號,16175是前面那個繫結訊號處理函式的pid,需要自行修改
os.kill(16175,signal.sigusr1)
使用訊號需要特別注意的地方:
如果乙個程序收到乙個sigusr1訊號,然後執行訊號繫結函式,第二個sigusr2訊號又來了,第乙個訊號沒有被處理完畢的話,第二個訊號就會丟棄。
所以,盡量不要在多執行緒中使用訊號。
這個不妥,測試沒發現有訊號丟失
例子演示:
接收訊號的程式,你會發現如果有另外一端使用多執行緒向這個程序傳送訊號,會遺漏一些訊號。
訊號相關概念
我記得我在程序間通訊的時候說到過一種方式 訊號量 終止在linux命令列上正在執行的可執行程式所用的ctrl c,也屬於一種訊號 是常見sigint訊號 所以,今天我想具體分享一下與訊號相關的一些概念。linux中訊號共有64個,常見訊號量只有31個,利用kill l命令就可以用來檢視全部訊號,如下...
訊號的基本概念以及訊號的產生
一.訊號產生的場景 1.使用者輸入命令,在shell 啟動乙個前台程序 2.當使用者按一下 ctrl c 的時候,從鍵盤產生乙個硬體中斷 3.此時cpu 正在執行這個程序的帶 則該程序的執行 暫停執行,cpu 從使用者態切換到核心態處理該硬體中斷.4.中斷驅動程式將ctrl c 解釋為乙個 sigi...
linux 訊號相關概念
訊號的阻塞就是讓系統暫時保留訊號待以後傳送。由於另外有辦法讓系統忽略訊號,所以一般情況下訊號的阻塞只是暫時的,只是為了防止訊號打斷敏感的操作。當需要修改某些全域性變數時,可以通過sigprocmask 函式阻塞處理函式中也使用該變數的訊號。在某些訊號處理函式中,為了防止同類訊號的到來,可以使用sig...