在咱們的生活中,信號隨處可見。好比,田徑比賽中的發令槍,就是給運動員發出起跑的信號;交通路口的紅綠燈,就是給咱們發出容許經過或禁止經過的信號。這些信號都有共同的特色:數組
簡單;異步
攜帶少許信息;函數
知足特定條件才發送。人工智能
信號是信息的載體,在Unix/Linux環境下,是一種古老、經典的通訊方式,對於現代Unix/Linux來講,依然是很是重要的IPC(進程間通訊)方式。調試
Unix系統早期版本就已經提供信號機制,但這些系統(如V7)所提供的信號機制並不完善,比較不可靠,信號可能出現丟失的現象。4.3BSD和SVR3均對信號模型進行了更改,增長了可靠信號機制。但不幸的是,兩者並不兼容。POSIX.1對可靠信號機制進行了標準化,從而信號機制在Unix/Linux獲得了大力的發展。cdn
信號的機制blog
信號的本質是一種軟件中斷。它與硬件中斷相似,提供了一種處理異步事件的方式,可是是在軟件層面上所實現的中斷。好比:進程
進程A向進程B發送信號,在收到信號以前,進程B正執行本身的代碼。但收到進程A的信號以後,無論進程B代碼執行到什麼地方,都應暫停運行,轉而去處理信號服務函數,處理完畢以後再繼續執行本身的代碼。事件
因爲信號是軟件層面上的中斷,其實現方式使得信號具備必定的延時性,但這個延時時間很是短,對於用戶來講,基本沒法察覺,能夠認爲具備實時性。it
每一個進程所收到的全部信號,都是由內核負責發送,而且由內核處理。
信號狀態
1. 遞達狀態
信號遞送而且送達到目標進程。
2. 未決狀態
處於信號產生與信號遞達之間的狀態。主要是因爲阻塞/屏蔽而產生此狀態。
3. 信號處理方式
a. 執行默認動做
b. 忽略
c. 捕捉(調用信號服務函數)
4. 阻塞信號集(信號屏蔽字)
該集合用於設置信號屏蔽,當將某個信號加入該集合中時,便可屏蔽該信號。後續收到該信號時,該信號的處理將延後,直到該信號的屏蔽被解除爲止。
5. 未決信號集
信號從發出到遞達的中間過程,叫做未決狀態。內核裏有個數組專門用來記錄信號的未決狀態,叫做未決信號集。當信號處理未決狀態時,對應位被置1,不然置0。
解除未決狀態的方式有兩種:
a. 此信號被解除阻塞
b. 此信號被忽略
信號的編號
想要查看當前系統支持的全部信號可用kill -l命令。
乍一看,信號有64個,其實只有62個,由於沒有32,33號信號,同時也不存在0號信號。31號如下的信號稱爲常規信號,或普通訊號,34號以上的信號稱爲實時信號。
信號四要素
信號編號;
信號名稱;
默認處理動做;
對應的事件。
信號的默認動做有如下幾種:
term:終止進程
ign: 忽略信號 (默認即時對該種信號忽略操做)
core:終止進程,生成Core文件。(查驗進程死亡緣由, 用於gdb調試)
stop:中止(暫停)進程
cont:繼續運行進程
這裏要特別注意兩個信號:
9) SIGKILL 和 19) SIGSTOP信號,它們是不容許被忽略或被捕捉,只能執行默認動做,同時也不能將其設置爲阻塞。這是由於,這兩個信號是用來終止進程的,若是它們可以被忽略/捕捉/阻塞,那進程將處於不可控狀態,內核將沒法對進程進行處理。
更多精彩內容,請關注公衆號良許Linux,公衆內回覆1024可免費得到5T技術資料,包括:Linux,C/C++,Python,樹莓派,嵌入式,Java,人工智能,等等。公衆號內回覆進羣,邀請您進高手如雲技術交流羣。