資料介紹
8.3 信號(hào)
8.3.1 信號(hào)概述
信號(hào)是UNIX中所使用的進(jìn)程通信的一種最古老的方法。它是在軟件層次上對(duì)中斷機(jī)制的一種模擬,是一種異步通信方式。信號(hào)可以直接進(jìn)行用戶(hù)空間進(jìn)程和內(nèi)核進(jìn)程之間的交互,內(nèi)核進(jìn)程也可以利用它來(lái)通知用戶(hù)空間進(jìn)程發(fā)生了哪些系統(tǒng)事件。它可以在任何時(shí)候發(fā)給某一進(jìn)程,而無(wú)需知道該進(jìn)程的狀態(tài)。如果該進(jìn)程當(dāng)前并未處于執(zhí)行態(tài),則該信號(hào)就由內(nèi)核保存起來(lái),直到該進(jìn)程恢復(fù)執(zhí)行再傳遞給它為止;如果一個(gè)信號(hào)被進(jìn)程設(shè)置為阻塞,則該信號(hào)的傳遞被延遲,直到其阻塞被取消時(shí)才被傳遞給進(jìn)程。
在第2章kill命令中曾講解到“?l”選項(xiàng),這個(gè)選項(xiàng)可以列出該系統(tǒng)所支持的所有信號(hào)的列表。在筆者的系統(tǒng)中,信號(hào)值在32之前的則有不同的名稱(chēng),而信號(hào)值在32以后的都是用“SIGRTMIN”或“SIGRTMAX”開(kāi)頭的,這就是兩類(lèi)典型的信號(hào)。前者是從UNIX系統(tǒng)中繼承下來(lái)的信號(hào),為不可靠信號(hào)(也稱(chēng)為非實(shí)時(shí)信號(hào));后者是為了解決前面“不可靠信號(hào)”的問(wèn)題而進(jìn)行了更改和擴(kuò)充的信號(hào),稱(chēng)為“可靠信號(hào)”(也稱(chēng)為實(shí)時(shí)信號(hào))。那么為什么之前的信號(hào)不可靠呢?這里首先要介紹一下信號(hào)的生命周期。
一個(gè)完整的信號(hào)生命周期可以分為3個(gè)重要階段,這3個(gè)階段由4個(gè)重要事件來(lái)刻畫(huà)的:信號(hào)產(chǎn)生、信號(hào)在進(jìn)程中注冊(cè)、信號(hào)在進(jìn)程中注銷(xiāo)、執(zhí)行信號(hào)處理函數(shù),如圖8.6所示。相鄰兩個(gè)事件的時(shí)間間隔構(gòu)成信號(hào)生命周期的一個(gè)階段。要注意這里的信號(hào)處理有多種方式,一般是由內(nèi)核完成的,當(dāng)然也可以由用戶(hù)進(jìn)程來(lái)完成,故在此沒(méi)有明確畫(huà)出。
圖8.6 信號(hào)生命周期
一個(gè)不可靠信號(hào)的處理過(guò)程是這樣的:如果發(fā)現(xiàn)該信號(hào)已經(jīng)在進(jìn)程中注冊(cè),那么就忽略該信號(hào)。因此,若前一個(gè)信號(hào)還未注銷(xiāo)又產(chǎn)生了相同的信號(hào)就會(huì)產(chǎn)生信號(hào)丟失。而當(dāng)可靠信號(hào)發(fā)送給一個(gè)進(jìn)程時(shí),不管該信號(hào)是否已經(jīng)在進(jìn)程中注冊(cè),都會(huì)被再注冊(cè)一次,因此信號(hào)就不會(huì)丟失。所有可靠信號(hào)都支持排隊(duì),而所有不可靠信號(hào)都不支持排隊(duì)。
注意這里信號(hào)的產(chǎn)生、注冊(cè)和注銷(xiāo)等是指信號(hào)的內(nèi)部實(shí)現(xiàn)機(jī)制,而不是調(diào)用信號(hào)的函數(shù)實(shí)現(xiàn)。因此,信號(hào)注冊(cè)與否,與本節(jié)后面講到的發(fā)送信號(hào)函數(shù)(如kill()等)以及信號(hào)安裝函數(shù)(如signal()等)無(wú)關(guān),只與信號(hào)值有關(guān)。
用戶(hù)進(jìn)程對(duì)信號(hào)的響應(yīng)可以有3種方式。
n 忽略信號(hào),即對(duì)信號(hào)不做任何處理,但是有兩個(gè)信號(hào)不能忽略,即SIGKILL及SIGSTOP。
n 捕捉信號(hào),定義信號(hào)處理函數(shù),當(dāng)信號(hào)發(fā)生時(shí),執(zhí)行相應(yīng)的自定義處理函數(shù)。
n 執(zhí)行缺省操作,Linux對(duì)每種信號(hào)都規(guī)定了默認(rèn)操作。
Linux中的大多數(shù)信號(hào)是提供給內(nèi)核的,表8.6列出了Linux中最為常見(jiàn)信號(hào)的含義及其默認(rèn)操作。
表8.6 常見(jiàn)信號(hào)的含義及其默認(rèn)操作
信 號(hào) 名含 義默 認(rèn) 操 作
SIGHUP該信號(hào)在用戶(hù)終端連接(正?;蚍钦#┙Y(jié)束時(shí)發(fā)出,通常是在終端的控制進(jìn)程結(jié)束時(shí),通知同一會(huì)話(huà)內(nèi)的各個(gè)作業(yè)與控制終端不再關(guān)聯(lián)終止
SIGINT該信號(hào)在用戶(hù)鍵入INTR字符(通常是Ctrl-C)時(shí)發(fā)出,終端驅(qū)動(dòng)程序發(fā)送此信號(hào)并送到前臺(tái)進(jìn)程中的每一個(gè)進(jìn)程終止
SIGQUIT該信號(hào)和SIGINT類(lèi)似,但由QUIT字符(通常是Ctrl-\)來(lái)控制終止
SIGILL該信號(hào)在一個(gè)進(jìn)程企圖執(zhí)行一條非法指令時(shí)(可執(zhí)行文件本身出現(xiàn)錯(cuò)誤,或者試圖執(zhí)行數(shù)據(jù)段、堆棧溢出時(shí))發(fā)出終止
SIGFPE該信號(hào)在發(fā)生致命的算術(shù)運(yùn)算錯(cuò)誤時(shí)發(fā)出。這里不僅包括浮點(diǎn)運(yùn)算錯(cuò)誤,還包括溢出及除數(shù)為0等其他所有的算術(shù)錯(cuò)誤終止
SIGKILL該信號(hào)用來(lái)立即結(jié)束程序的運(yùn)行,并且不能被阻塞、處理或忽略終止
SIGALRM該信號(hào)當(dāng)一個(gè)定時(shí)器到時(shí)的時(shí)候發(fā)出終止
SIGSTOP該信號(hào)用于暫停一個(gè)進(jìn)程,且不能被阻塞、處理或忽略暫停進(jìn)程
SIGTSTP該信號(hào)用于交互停止進(jìn)程,用戶(hù)鍵入SUSP字符時(shí)(通常是Ctrl+Z)發(fā)出這個(gè)信號(hào)停止進(jìn)程
SIGCHLD子進(jìn)程改變狀態(tài)時(shí),父進(jìn)程會(huì)收到這個(gè)信號(hào)忽略
SIGABORT進(jìn)程異常終止時(shí)發(fā)出
8.3.2 信號(hào)發(fā)送與捕捉
發(fā)送信號(hào)的函數(shù)主要有kill()、raise()、alarm()以及pause(),下面就依次對(duì)其進(jìn)行介紹。
1.kill()和raise()
?。?)函數(shù)說(shuō)明。
kill()函數(shù)同讀者熟知的kill系統(tǒng)命令一樣,可以發(fā)送信號(hào)給進(jìn)程或進(jìn)程組(實(shí)際上,kill系統(tǒng)命令只是kill()函數(shù)的一個(gè)用戶(hù)接口)。這里需要注意的是,它不僅可以中止進(jìn)程(實(shí)際上發(fā)出SIGKILL信號(hào)),也可以向進(jìn)程發(fā)送其他信號(hào)。
與kill()函數(shù)所不同的是,raise()函數(shù)允許進(jìn)程向自身發(fā)送信號(hào)。
?。?)函數(shù)格式。
表8.7列出了kill()函數(shù)的語(yǔ)法要點(diǎn)。
表8.7 kill()函數(shù)語(yǔ)法要點(diǎn)
所需頭文件#include 《signal.h》
#include 《sys/types.h》
函數(shù)原型int kill(pid_t pid, int sig)
函數(shù)傳入值pid:正數(shù):要發(fā)送信號(hào)的進(jìn)程號(hào)
0:信號(hào)被發(fā)送到所有和當(dāng)前進(jìn)程在同一個(gè)進(jìn)程組的進(jìn)程
-1:信號(hào)發(fā)給所有的進(jìn)程表中的進(jìn)程(除了進(jìn)程號(hào)最大的進(jìn)程外)
《-1:信號(hào)發(fā)送給進(jìn)程組號(hào)為-pid的每一個(gè)進(jìn)程
sig:信號(hào)
函數(shù)返回值成功:0
出錯(cuò):-1
表8.8列出了raise()函數(shù)的語(yǔ)法要點(diǎn)。
表8.8 raise()函數(shù)語(yǔ)法要點(diǎn)
所需頭文件#include 《signal.h》
#include 《sys/types.h》
函數(shù)原型int raise(int sig)
函數(shù)傳入值sig:信號(hào)
函數(shù)返回值成功:0
出錯(cuò):-1
8.3.1 信號(hào)概述
信號(hào)是UNIX中所使用的進(jìn)程通信的一種最古老的方法。它是在軟件層次上對(duì)中斷機(jī)制的一種模擬,是一種異步通信方式。信號(hào)可以直接進(jìn)行用戶(hù)空間進(jìn)程和內(nèi)核進(jìn)程之間的交互,內(nèi)核進(jìn)程也可以利用它來(lái)通知用戶(hù)空間進(jìn)程發(fā)生了哪些系統(tǒng)事件。它可以在任何時(shí)候發(fā)給某一進(jìn)程,而無(wú)需知道該進(jìn)程的狀態(tài)。如果該進(jìn)程當(dāng)前并未處于執(zhí)行態(tài),則該信號(hào)就由內(nèi)核保存起來(lái),直到該進(jìn)程恢復(fù)執(zhí)行再傳遞給它為止;如果一個(gè)信號(hào)被進(jìn)程設(shè)置為阻塞,則該信號(hào)的傳遞被延遲,直到其阻塞被取消時(shí)才被傳遞給進(jìn)程。
在第2章kill命令中曾講解到“?l”選項(xiàng),這個(gè)選項(xiàng)可以列出該系統(tǒng)所支持的所有信號(hào)的列表。在筆者的系統(tǒng)中,信號(hào)值在32之前的則有不同的名稱(chēng),而信號(hào)值在32以后的都是用“SIGRTMIN”或“SIGRTMAX”開(kāi)頭的,這就是兩類(lèi)典型的信號(hào)。前者是從UNIX系統(tǒng)中繼承下來(lái)的信號(hào),為不可靠信號(hào)(也稱(chēng)為非實(shí)時(shí)信號(hào));后者是為了解決前面“不可靠信號(hào)”的問(wèn)題而進(jìn)行了更改和擴(kuò)充的信號(hào),稱(chēng)為“可靠信號(hào)”(也稱(chēng)為實(shí)時(shí)信號(hào))。那么為什么之前的信號(hào)不可靠呢?這里首先要介紹一下信號(hào)的生命周期。
一個(gè)完整的信號(hào)生命周期可以分為3個(gè)重要階段,這3個(gè)階段由4個(gè)重要事件來(lái)刻畫(huà)的:信號(hào)產(chǎn)生、信號(hào)在進(jìn)程中注冊(cè)、信號(hào)在進(jìn)程中注銷(xiāo)、執(zhí)行信號(hào)處理函數(shù),如圖8.6所示。相鄰兩個(gè)事件的時(shí)間間隔構(gòu)成信號(hào)生命周期的一個(gè)階段。要注意這里的信號(hào)處理有多種方式,一般是由內(nèi)核完成的,當(dāng)然也可以由用戶(hù)進(jìn)程來(lái)完成,故在此沒(méi)有明確畫(huà)出。
圖8.6 信號(hào)生命周期
一個(gè)不可靠信號(hào)的處理過(guò)程是這樣的:如果發(fā)現(xiàn)該信號(hào)已經(jīng)在進(jìn)程中注冊(cè),那么就忽略該信號(hào)。因此,若前一個(gè)信號(hào)還未注銷(xiāo)又產(chǎn)生了相同的信號(hào)就會(huì)產(chǎn)生信號(hào)丟失。而當(dāng)可靠信號(hào)發(fā)送給一個(gè)進(jìn)程時(shí),不管該信號(hào)是否已經(jīng)在進(jìn)程中注冊(cè),都會(huì)被再注冊(cè)一次,因此信號(hào)就不會(huì)丟失。所有可靠信號(hào)都支持排隊(duì),而所有不可靠信號(hào)都不支持排隊(duì)。
注意這里信號(hào)的產(chǎn)生、注冊(cè)和注銷(xiāo)等是指信號(hào)的內(nèi)部實(shí)現(xiàn)機(jī)制,而不是調(diào)用信號(hào)的函數(shù)實(shí)現(xiàn)。因此,信號(hào)注冊(cè)與否,與本節(jié)后面講到的發(fā)送信號(hào)函數(shù)(如kill()等)以及信號(hào)安裝函數(shù)(如signal()等)無(wú)關(guān),只與信號(hào)值有關(guān)。
用戶(hù)進(jìn)程對(duì)信號(hào)的響應(yīng)可以有3種方式。
n 忽略信號(hào),即對(duì)信號(hào)不做任何處理,但是有兩個(gè)信號(hào)不能忽略,即SIGKILL及SIGSTOP。
n 捕捉信號(hào),定義信號(hào)處理函數(shù),當(dāng)信號(hào)發(fā)生時(shí),執(zhí)行相應(yīng)的自定義處理函數(shù)。
n 執(zhí)行缺省操作,Linux對(duì)每種信號(hào)都規(guī)定了默認(rèn)操作。
Linux中的大多數(shù)信號(hào)是提供給內(nèi)核的,表8.6列出了Linux中最為常見(jiàn)信號(hào)的含義及其默認(rèn)操作。
表8.6 常見(jiàn)信號(hào)的含義及其默認(rèn)操作
信 號(hào) 名含 義默 認(rèn) 操 作
SIGHUP該信號(hào)在用戶(hù)終端連接(正?;蚍钦#┙Y(jié)束時(shí)發(fā)出,通常是在終端的控制進(jìn)程結(jié)束時(shí),通知同一會(huì)話(huà)內(nèi)的各個(gè)作業(yè)與控制終端不再關(guān)聯(lián)終止
SIGINT該信號(hào)在用戶(hù)鍵入INTR字符(通常是Ctrl-C)時(shí)發(fā)出,終端驅(qū)動(dòng)程序發(fā)送此信號(hào)并送到前臺(tái)進(jìn)程中的每一個(gè)進(jìn)程終止
SIGQUIT該信號(hào)和SIGINT類(lèi)似,但由QUIT字符(通常是Ctrl-\)來(lái)控制終止
SIGILL該信號(hào)在一個(gè)進(jìn)程企圖執(zhí)行一條非法指令時(shí)(可執(zhí)行文件本身出現(xiàn)錯(cuò)誤,或者試圖執(zhí)行數(shù)據(jù)段、堆棧溢出時(shí))發(fā)出終止
SIGFPE該信號(hào)在發(fā)生致命的算術(shù)運(yùn)算錯(cuò)誤時(shí)發(fā)出。這里不僅包括浮點(diǎn)運(yùn)算錯(cuò)誤,還包括溢出及除數(shù)為0等其他所有的算術(shù)錯(cuò)誤終止
SIGKILL該信號(hào)用來(lái)立即結(jié)束程序的運(yùn)行,并且不能被阻塞、處理或忽略終止
SIGALRM該信號(hào)當(dāng)一個(gè)定時(shí)器到時(shí)的時(shí)候發(fā)出終止
SIGSTOP該信號(hào)用于暫停一個(gè)進(jìn)程,且不能被阻塞、處理或忽略暫停進(jìn)程
SIGTSTP該信號(hào)用于交互停止進(jìn)程,用戶(hù)鍵入SUSP字符時(shí)(通常是Ctrl+Z)發(fā)出這個(gè)信號(hào)停止進(jìn)程
SIGCHLD子進(jìn)程改變狀態(tài)時(shí),父進(jìn)程會(huì)收到這個(gè)信號(hào)忽略
SIGABORT進(jìn)程異常終止時(shí)發(fā)出
8.3.2 信號(hào)發(fā)送與捕捉
發(fā)送信號(hào)的函數(shù)主要有kill()、raise()、alarm()以及pause(),下面就依次對(duì)其進(jìn)行介紹。
1.kill()和raise()
?。?)函數(shù)說(shuō)明。
kill()函數(shù)同讀者熟知的kill系統(tǒng)命令一樣,可以發(fā)送信號(hào)給進(jìn)程或進(jìn)程組(實(shí)際上,kill系統(tǒng)命令只是kill()函數(shù)的一個(gè)用戶(hù)接口)。這里需要注意的是,它不僅可以中止進(jìn)程(實(shí)際上發(fā)出SIGKILL信號(hào)),也可以向進(jìn)程發(fā)送其他信號(hào)。
與kill()函數(shù)所不同的是,raise()函數(shù)允許進(jìn)程向自身發(fā)送信號(hào)。
?。?)函數(shù)格式。
表8.7列出了kill()函數(shù)的語(yǔ)法要點(diǎn)。
表8.7 kill()函數(shù)語(yǔ)法要點(diǎn)
所需頭文件#include 《signal.h》
#include 《sys/types.h》
函數(shù)原型int kill(pid_t pid, int sig)
函數(shù)傳入值pid:正數(shù):要發(fā)送信號(hào)的進(jìn)程號(hào)
0:信號(hào)被發(fā)送到所有和當(dāng)前進(jìn)程在同一個(gè)進(jìn)程組的進(jìn)程
-1:信號(hào)發(fā)給所有的進(jìn)程表中的進(jìn)程(除了進(jìn)程號(hào)最大的進(jìn)程外)
《-1:信號(hào)發(fā)送給進(jìn)程組號(hào)為-pid的每一個(gè)進(jìn)程
sig:信號(hào)
函數(shù)返回值成功:0
出錯(cuò):-1
表8.8列出了raise()函數(shù)的語(yǔ)法要點(diǎn)。
表8.8 raise()函數(shù)語(yǔ)法要點(diǎn)
所需頭文件#include 《signal.h》
#include 《sys/types.h》
函數(shù)原型int raise(int sig)
函數(shù)傳入值sig:信號(hào)
函數(shù)返回值成功:0
出錯(cuò):-1
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 電氣信息工程叢書(shū)之Linux PowerPC詳解-核心篇 0次下載
- 談?wù)勄度胧较到y(tǒng)中多進(jìn)程設(shè)計(jì)與進(jìn)程通信
- 嵌入式Linux進(jìn)程 -進(jìn)程間通信
- Linux虛擬機(jī)之tcpdump命令操作詳解 23次下載
- 串口通信之讀取與發(fā)送及LabView文件下載 184次下載
- BLE實(shí)驗(yàn)詳解之藍(lán)牙溫度計(jì)設(shè)計(jì)方案 25次下載
- BLE實(shí)驗(yàn)詳解之藍(lán)牙血壓計(jì)設(shè)計(jì)方案 37次下載
- BLE實(shí)驗(yàn)詳解之藍(lán)牙鍵盤(pán)設(shè)計(jì)方案 58次下載
- linux操作系統(tǒng)下的進(jìn)程通信 0次下載
- 進(jìn)程間通信之消息隊(duì)列詳解 0次下載
- 進(jìn)程間通信之Linux下進(jìn)程間通信概述 0次下載
- 進(jìn)程間通信之信號(hào)量淺析 0次下載
- 進(jìn)程間通信之共享內(nèi)存 1次下載
- 進(jìn)程間通信之:管道 0次下載
- 邏輯漏洞之越權(quán)詳解 5次下載
- Linux用戶(hù)身份與進(jìn)程權(quán)限詳解 403次閱讀
- 突發(fā)通信信號(hào)是啥?突發(fā)通信信號(hào)是如何產(chǎn)生的? 1402次閱讀
- Linux下進(jìn)程通信的方法 749次閱讀
- 關(guān)于Python多進(jìn)程和多線程詳解 872次閱讀
- SoC核間通信的實(shí)現(xiàn)機(jī)制之mailbox中斷 1855次閱讀
- 從進(jìn)程模型轉(zhuǎn)換成線程模型的優(yōu)缺點(diǎn) 476次閱讀
- Jacinto 7核間通信解決方案 1226次閱讀
- 進(jìn)程間通信的實(shí)現(xiàn)方式 771次閱讀
- Linux進(jìn)程間通信方法之管道 1997次閱讀
- 鴻蒙內(nèi)核進(jìn)程間為何要通訊? 2759次閱讀
- 淺談進(jìn)程之間的通信方式 2834次閱讀
- USB接口外殼地和信號(hào)地間的處理 1.7w次閱讀
- Linux進(jìn)程的概念及進(jìn)程通信的應(yīng)用場(chǎng)景 6729次閱讀
- 進(jìn)程間與線程間的通信方式 8945次閱讀
- Linux的系統(tǒng)選擇、體系結(jié)構(gòu)及應(yīng)用詳解 4277次閱讀
下載排行
本周
- 1TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開(kāi)關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 6基于FPGA的C8051F單片機(jī)開(kāi)發(fā)板設(shè)計(jì)
- 0.70 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21548次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183278次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多