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