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

ad如何設(shè)置兩個(gè)元器件的距離
如何用兩塊ad9851實(shí)現(xiàn)輸出正交的兩個(gè)余弦信號(hào)?
單穩(wěn)態(tài)觸發(fā)器的兩個(gè)工作狀態(tài)是什么
具有兩個(gè)獨(dú)立PLL、八路輸出、集成EEPROM的LMK03328超低抖動(dòng)時(shí)鐘發(fā)生器數(shù)據(jù)表

評(píng)論