什么是信號
信號可以理解為軟件中斷,是在軟件層次上對中斷機(jī)制的一種模擬,在原理上,一個進(jìn)程收到一個信號與處理器收到一個中斷請求可以說是差不多的。信號是異步的,一個進(jìn)程不必通過任何操作來等待信號的到達(dá)。信號可以直接進(jìn)行用戶空間進(jìn)程和內(nèi)核進(jìn)程之間的交互,內(nèi)核進(jìn)程也可以利用它來通知用戶空間進(jìn)程發(fā)生了哪些系統(tǒng)事件。
誰來產(chǎn)生信號
信號事件的發(fā)生有兩個來源:
(1) 硬件來源,比如我們按下ctrl+c,會產(chǎn)生SIGINT信號。
(2) 軟件來源,比如我們調(diào)用alarm函數(shù)來產(chǎn)生SIGALRM信號。
常用信號
Linux信號的編號是從1-64,其中32和33空缺,沒有對應(yīng)的信號。通過kill -l 可查看所有的信號。
1~31之間的信號叫做不可靠信號, 信號可能會丟失, 也叫做非實(shí)時信號。
34~64之間的信號叫做可靠信號, 信號不會丟失, 也叫做實(shí)時信號。
信號響應(yīng)方式
信號有如下三種響應(yīng)方式:
(1) 忽略信號,即對信號不做任何處理,但是有兩個信號不能忽略,即 SIGKILL 及 SIGSTOP。
(2) 捕捉信號,定義信號處理函數(shù),當(dāng)信號發(fā)生時,執(zhí)行相應(yīng)的自定義處理函數(shù)。
(3) 執(zhí)行缺省操作,Linux 對每種信號都規(guī)定了默認(rèn)操作。
信號處理過程
信號處理的大致流程如下:
信號產(chǎn)生 -》 信號注冊 -》 信號在進(jìn)程中注銷 -》 信號處理函數(shù)執(zhí)行完畢
我們主要講一下“信號注冊” 和“信號在進(jìn)程中注銷”。其他兩個都比較好理解。
信號注冊指的是在目標(biāo)進(jìn)程中注冊,該目標(biāo)進(jìn)程中有未決信號的信息。啥叫未決信號呢,實(shí)際執(zhí)行信號的處理動作稱為信號遞達(dá),信號從產(chǎn)生到遞達(dá)之間的狀態(tài),稱為信號未決。
先來看一下對應(yīng)的結(jié)構(gòu)體:
struct sigpending{ //未決信號鏈的頭部與尾部 struct sigqueue *head, *tail; //未決信號集 sigset_t signal;};
struct sigqueue{ struct sigqueue *next; //信號所攜帶的信息 siginfo_t info;}
信號注冊的過程就是將信號值加入到未決信號集siginfo_t中,將信號所攜帶的信息加入到未決信號鏈的某一個sigqueue中去。
因此,對于可靠的信號,可能存在多個未決信號的sigqueue結(jié)構(gòu),對于每次信號到來都會注冊。而不可靠信號只注冊一次,只有一個sigqueue結(jié)構(gòu)。
只要信號在進(jìn)程的未決信號集中,表明進(jìn)程已經(jīng)知道這些信號了,還沒來得及處理,或者是這些信號被阻塞。
信號在進(jìn)程中注銷是指進(jìn)程已經(jīng)接收到信號了,會在鏈表中移除。在進(jìn)程的執(zhí)行過程中,每次從系統(tǒng)調(diào)用或中斷返回用戶空間的時候,都會檢查是否有信號沒有被處理。如果這些信號沒有被阻塞,那么就調(diào)用相應(yīng)的信號處理函數(shù)來處理這些信號。可靠信號和不可靠信號的處理有所不同:
不可靠信號:由于不可靠信號在未決信號鏈中只有一個sigqueue結(jié)構(gòu),因此將它刪除的同時,也會將信號從未決信號集中刪除。
可靠信號:由于可靠信號在未決信號鏈中可能有多個sigqueue結(jié)構(gòu),如果只有一個,也將信號從未決信號集中刪除掉。如果有多個則不從未決信號集中刪除信號,注銷完畢。
原文標(biāo)題:Linux信號及工作原理
文章出處:【微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責(zé)任編輯:haq
-
Linux
+關(guān)注
關(guān)注
87文章
11342瀏覽量
210186 -
信號
+關(guān)注
關(guān)注
11文章
2804瀏覽量
77022
原文標(biāo)題:Linux信號及工作原理
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論