




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章Linux信號內(nèi)容提要信號概述Linux系統(tǒng)中的信號信號的定義發(fā)送信號信號文件7.1信號概述信號概述
信號是進(jìn)程對所發(fā)生事件的一種響應(yīng)模式,例如,數(shù)據(jù)溢出和定時器到期等,內(nèi)核預(yù)設(shè)了多種事件,為它們定義了相應(yīng)的信號,并設(shè)置了對應(yīng)的信號處理方式;當(dāng)事件發(fā)生時,進(jìn)程會收到相應(yīng)的信號,進(jìn)程暫停運(yùn)行,轉(zhuǎn)而執(zhí)行對應(yīng)的信號處理程序,待信號處理完成,進(jìn)程從中斷點(diǎn)恢復(fù)運(yùn)行。通常,信號的發(fā)生具有異步性,它可能發(fā)生在進(jìn)程運(yùn)行過程中的任意時間點(diǎn),所以,信號也稱為一步信號。信號和中斷在概念上具有相似性,信號屬于操作系統(tǒng)的范疇,而中斷屬于處理器對外部設(shè)備事件的響應(yīng)方式。應(yīng)用編程接口分類API功能描述信號處理sigprocmask修改當(dāng)前進(jìn)程的信號掩碼sigaction定義信號的處理方式sigpending檢測到達(dá)的阻塞信號sigwaitinfo等待阻塞信號的到達(dá)發(fā)送信號kill向進(jìn)程發(fā)送信號abort向進(jìn)程發(fā)送SIGABRT信號sigqueue發(fā)送實(shí)時信號信號文件signalfd創(chuàng)建信號文件7.2Linux系統(tǒng)中的信號信號的分類標(biāo)準(zhǔn)信號標(biāo)準(zhǔn)信號源自Unix,信號編號以正整數(shù)表示,范圍從1至31,內(nèi)核僅用一位表示標(biāo)準(zhǔn)信號,當(dāng)值為0,表示該位對應(yīng)的信號未發(fā)生,若值為1,表示該位對應(yīng)的信號已發(fā)生。實(shí)際時信號為彌補(bǔ)標(biāo)準(zhǔn)信號的某些不足,引入了實(shí)時信號,信號編號從32至64,每個實(shí)時信號在內(nèi)核中用隊(duì)列表示,支持排隊(duì)和參數(shù)傳遞。信號編號值動作含義SIGHUP1Term與終端的連接斷開SIGINT2Term終端中斷SIGQUIT3Core終端退出SIGILL4Core非法指令SIGABRT6Core中止進(jìn)程SIGFPE8Core浮點(diǎn)異常SIGKILL9Term殺死進(jìn)程(不可屏蔽)SIGSEGV11Core段非法錯誤SIGPIPE13Term管道讀寫錯誤SIGALRM14Term實(shí)時計(jì)時器到期SIGTERM15Term終止進(jìn)程SIGUSR130,10,16Term用戶自定義信號SIGUSR231,12,17Term用戶自定義信號SIGCHLD20,17,18Ign告知父進(jìn)程,子進(jìn)程終止SIGCONT19,18,25Cont若停止則繼續(xù)SIGSTOP17,19,23Stop停止進(jìn)程(不可屏蔽)SIGTSTP18,20,24Stop終端停止SIGTTIN21,21,26Stop后臺進(jìn)程從終端讀取標(biāo)準(zhǔn)信號信號編號值動作含義SIGTTOU22,22,27Stop后臺進(jìn)程向終端寫SIGBUS10,7,10Core總線錯誤SIGPROF27,27,29Term實(shí)用計(jì)時器到期SIGSYS12,31,12Core無效的系統(tǒng)調(diào)用SIGTRAP5Core跟蹤/斷點(diǎn)陷阱SIGURG16,23,21Ign套接字上的緊急數(shù)據(jù)SIGVTALRM26,26,28Term虛擬計(jì)時器到期SIGXCPU24,24,30CoreCPU時間限制超時SIGXFSZ25,25,31Core超過文件最大長度限制SIGIOT6Core與SIGABRT信號同義SIGEMT7,-,7Term模擬陷入SIGSTKFLT-,16,-Term協(xié)處理器錯誤SIGIO23,29,22TermI/O可能產(chǎn)生SIGCLD-,-,18Ign與SIGCHLD信號同義SIGPWR29,30,19Term電量即將耗盡SIGINFO29,-,-與SIGPWR信號同義SIGLOST-,-,-Term文件鎖丟失(未使用)SIGWINCH28,28,20Ign終端窗口尺寸發(fā)生變化SIGUNUSED-,31,-CoreSIGSYS信號同義標(biāo)準(zhǔn)信號(續(xù))動作類型含義Term結(jié)束進(jìn)程Ign忽略信號Core結(jié)束進(jìn)程并產(chǎn)生核心文件Stop暫停進(jìn)程運(yùn)行Cont恢復(fù)暫停進(jìn)程的運(yùn)行Linux信號的產(chǎn)生1.用戶信號在用戶與系統(tǒng)交互過程中產(chǎn)生,例如,當(dāng)用戶在鍵盤上輸入Ctrl+C和Ctrl+\時,終端驅(qū)動程序通知內(nèi)核將向目標(biāo)進(jìn)程發(fā)送信號SIGINT和SIGQUIT。2.內(nèi)核內(nèi)核在執(zhí)行過程中產(chǎn)生,例如,異步I/O模式下,I/O狀態(tài)就緒,內(nèi)核向目標(biāo)進(jìn)程發(fā)送相應(yīng)的信號SIGIO。3.進(jìn)程一個進(jìn)程向另一個進(jìn)程發(fā)送信號,例如,進(jìn)程通過調(diào)用kill函數(shù)向其他進(jìn)程發(fā)送信號。信號的處理方式1.異步處理模式默認(rèn)情況下,信號采用異步處理模式,信號可能發(fā)生在進(jìn)程運(yùn)行的任意時刻,當(dāng)信號發(fā)生時,進(jìn)程暫停運(yùn)行,保存現(xiàn)場,轉(zhuǎn)而執(zhí)行信號處理程序,待信號處理程序執(zhí)行完畢,恢復(fù)現(xiàn)場,從中斷點(diǎn)繼續(xù)運(yùn)行。2.同步處理模式當(dāng)信號被阻塞時,到達(dá)的信號不會馬上處理,而是處于等待狀態(tài),進(jìn)程可自主選擇時機(jī)進(jìn)行處理。信號的接收對象
在多線程環(huán)境下,線程共享進(jìn)程的信號處理方式,但信號掩碼各自獨(dú)立,線程可屏蔽各自不感興趣的信號,信號的發(fā)送目標(biāo)可為進(jìn)程或線程,當(dāng)目標(biāo)為進(jìn)程時,進(jìn)程中的線程均有機(jī)會處理到達(dá)的信號,機(jī)會取決于進(jìn)程調(diào)度,當(dāng)目標(biāo)為線程時,由接收信號的線程處理。信號的延遲
信號除因阻塞而被延遲處理外,在未阻塞的情況下,從信號的產(chǎn)生到處理,可能存在一定的延遲,信號處理取決于下一個調(diào)度時機(jī),例如,時間片耗盡后重新被選中、系統(tǒng)調(diào)用結(jié)束和中斷返回。7.3信號的定義信號掩碼
信號掩碼是由一組信號構(gòu)成的集合,當(dāng)屬于該集合的信號到達(dá)進(jìn)程時,對信號不作任何處理,直至信號阻塞被解除,期間一直處于等待狀態(tài)。設(shè)置信號掩碼頭文件
#include<signal.h>函數(shù)原型
int
sigprocmask(inthow,constsigset_t*set,sigset_t*oldset);功能 重置進(jìn)程的信號掩碼。參數(shù)
how:操作方式。
set:新信號集。
oldset:替換的信號掩碼。返回值 成功,返回0,失敗,返回-1。信號處理的定義sigaction(1/3)頭文件
#include<signal.h>函數(shù)原型
int
sigaction(int
signum,conststruct
sigaction*act,struct
sigaction*oldact);功能 定義信號的行為。參數(shù)
signum:信號編號。
act:信號的處理方式。
oldact:原信號的處理方式。返回值 成功返回0,失敗返回-1。信號處理的定義sigaction(2/3)
struct
sigaction{ //信號處理函數(shù)
void(*sa_handler)(int); //攜帶更多參數(shù)的信號處理函數(shù)
void(*sa_sigaction)(int,siginfo_t*,void*); //信號處理期間的信號掩碼
sigset_t
sa_mask; //信號處理的更多特性
int
sa_flags; //glibc內(nèi)部使用
void(*sa_restorer)(void);};信號處理的定義sigaction(3/3)siginfo_t{
int
si_signo;//信號編號
int
si_errno;//錯誤值
int
si_code;//信號來源的詳細(xì)信息
pid_t
si_pid;//進(jìn)程ID
uid_t
si_uid;//進(jìn)程所屬實(shí)際用戶ID
int
si_status;//進(jìn)程的結(jié)束狀態(tài)
clock_t
si_utime;//進(jìn)程消耗的用戶時間
clock_t
si_stime;//進(jìn)程消耗的系統(tǒng)時間
sigval_t
si_value;//信號傳遞的參數(shù)
int
si_overrun;//定時器溢出次數(shù)
int
si_timerid;//POSIX.1b定時器IDvoid*si_addr;//產(chǎn)生異常的地址
longsi_band;//I/O事件關(guān)聯(lián)的事件值
int
si_fd;//與I/O事件相關(guān)的文件描述符...}實(shí)例分析voidhandler(int
signum){
printf("\nSIGINT
cought\n\n");}main(){
struct
sigactionact;
sigfillset(&(act.sa_mask));
act.sa_handler=handler;
sigaction(SIGINT,&act,NULL); pause()
printf("pausereturn\n",);}
到達(dá)的阻塞信號
當(dāng)位于信號掩碼的信號到達(dá)進(jìn)程時,信號被阻塞,直至阻塞解除,期間信號處于阻塞狀態(tài)??煞謩e通過sigpending和sigwaitinfo函數(shù)檢測到達(dá)的阻塞信號和同步等待排隊(duì)的信號。sigpending函數(shù)頭文件
#include<signal.h>函數(shù)原型
int
sigpending(sigset_t*set);功能 檢測到達(dá)的阻塞信號。參數(shù)
Set:指向到達(dá)的阻塞信號。返回值 成功,返回0,失敗,返回-1。sigwaitinfo函數(shù)頭文件
#include<signal.h>函數(shù)原型
int
sigwaitinfo(const
sigset_t*set,siginfo_t*info);功能 等待阻塞信號的到達(dá)。參數(shù)
set:等待的阻塞信號。
info:到達(dá)的阻塞信號。返回值 成功,返回0,失敗,返回-1。
實(shí)例分析int
main(int
argc,char*argv[])
sigset_tset;
sigfillset(&set);
sigprocmask(SIG_SETMASK,&set,NULL); sleep(atol(argv[1])); for(;;){
siginfo_t
si;
int
sig=sigwaitinfo(&set,&si); if((sig==-1)||(sig==SIGINT||sig==SIGTERM)){
printf("sigwaitinfofailed|SIGINT|SIGTERM\n"); exit(0); }
printf("getsignal:%d\t%s\n",sig,strsignal(sig));
printf("si_signo=%d,si_code=%d(%s),si_value=%d\n",
si.si_signo,si.si_code, (si.si_code==SI_USER)?"SI_USER": (si.si_code==SI_QUEUE)?"SI_QUEUE":"other",
si.si_value.sival_int);
printf("si_pid=%ld\tsi_uid=%ld\n",(long)si.si_pid,(long)si.si_uid); }}7.4發(fā)送信號發(fā)送標(biāo)準(zhǔn)信號頭文件
#include<sys/types.h #include<signal.h>函數(shù)原型
int
kill(pid_t
pid,int
sig);;功能 向進(jìn)程發(fā)送信號。參數(shù)
pid:進(jìn)程ID。
sig:信號編號。返回值 調(diào)用成功返回0,否則返回-1。參數(shù)pid含義pd>0目標(biāo)進(jìn)程的ID為pidpid=0調(diào)用者進(jìn)程所屬組中的所有進(jìn)程pid=-1除初始化進(jìn)程init外,有權(quán)發(fā)送的所有進(jìn)程pid<-1進(jìn)程組ID為-pid的所有進(jìn)程發(fā)送實(shí)時信號sigqueue函數(shù)頭文件
#include<sys/types.h> #include<signal.h>函數(shù)原型
int
sigqueue(pid_t
pid,int
sig,constunionsigval
val);功能 向進(jìn)程發(fā)送實(shí)時信號。參數(shù)
pid:目標(biāo)進(jìn)程ID。
sig:實(shí)時信號編號。
val:傳遞的參數(shù)。返回值 成功返回0;失敗返回-1。發(fā)送實(shí)時信號
sigqueue函數(shù)向進(jìn)程pid發(fā)送實(shí)時新號sig,并攜帶參數(shù)val,val為sigval類型指針,sigval類型的定義如下。typedefunionsigval{
int
sival_int; //用于傳送一個整型數(shù)
void*sival_ptr; //指向參數(shù)地址
}sigval_t;
sigqueue函數(shù)基于rt_sigqueueinfo系統(tǒng)調(diào)用實(shí)現(xiàn),接收實(shí)時信號的進(jìn)程需通過sigaction函數(shù)的SA_SIGINFO選項(xiàng)定義信號處理函數(shù),以便接收信號和攜帶的數(shù)據(jù)。7.5信號文件信號文件
信號文件是一種將到達(dá)的信號作為字節(jié)流的特殊文件。
Linux內(nèi)核自2.6.22引入了一種非標(biāo)準(zhǔn)的系統(tǒng)調(diào)用接口eventfd、signalfd和timerfd,它們將事件、信號和到期時間抽象為字節(jié)流,其中signalfd便是信號文件的應(yīng)用編程接口。信號文件signalfd函數(shù)頭文件
#include<sys/signalfd.h>函數(shù)原型
int
signalfd(int
fd,constsigset_t*mask,intflags);功能 創(chuàng)建信號文件。參數(shù)
fd:文件描述符。
mask:監(jiān)聽的信號集。
flags:打開方式。返回值 成功:返回文件描述符,失敗,返回-1。信號文件(續(xù))struct
signalfd_siginfo{uint32_tssi_signo;//信號編號
int32_tssi_errno;//錯誤碼(未使用
int32_tssi_code;//信號碼
uint32_tssi_pid;//發(fā)送進(jìn)程IDuint32_tssi_uid;//發(fā)送用戶實(shí)際IDint32_tssi_fd;//文件描述符(SIGIO)uint32_tssi_tid;//內(nèi)核定時器IDuint32_tssi_band;//I/O事件(SIGIO)*/......uint8_tpad[X];//擴(kuò)充成員變量};參數(shù)flags
含義SFD_NONBLOCK非阻塞方式讀寫文件SFD_CLOEXEC設(shè)置close-on-exec選項(xiàng)signalfd函數(shù)中參數(shù)flags的定義實(shí)例分析int
main(int
argc,char*argv[]){
sigset_tmask;
sigemptyset(&mask);
sigaddset(&mask,SIGQUIT);
sigaddset(&mask,SIGUSR1);
sigprocmask(SIG_BLOCK,&mask,NULL);
int
sfd=signalfd(-1,&mask,0); for(;;){
struct
signalfd_siginfo
fdsi;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中小企業(yè)人員書面勞動合同
- 綠色低碳產(chǎn)業(yè)項(xiàng)目合作合同
- 砂礫石供貨合同
- 危險廢物運(yùn)輸合同協(xié)議
- 煤炭銷售合同
- 環(huán)保項(xiàng)目資金籌措及使用協(xié)議
- 新能源汽車充電基礎(chǔ)設(shè)施建設(shè)合作合同
- 2023-2024學(xué)年高中信息技術(shù)選修2(浙教版2019)-網(wǎng)絡(luò)基礎(chǔ)-教學(xué)設(shè)計(jì)-2.2-網(wǎng)絡(luò)體系結(jié)構(gòu)與TCPIP協(xié)議
- 劇組場地使用損壞賠償協(xié)議
- 粵教版高中信息技術(shù)必修教學(xué)設(shè)計(jì)-2.3 信息的鑒別與評價-
- 消化性潰瘍診療(概述、病因、診斷、治療、特殊人群與注意事項(xiàng))
- 中國古代舞蹈史
- 肛門直腸測壓
- 2022年甘肅省中考英語試卷真題
- GB/T 7701.1-2008煤質(zhì)顆?;钚蕴繗庀嘤妹嘿|(zhì)顆?;钚蕴?/a>
- CB/T 467-1995法蘭青銅閘閥
- 醫(yī)用電子儀器期末模擬考試卷測試題附答案
- 《Colours》教學(xué)講解課件
- 山東省中考物理總復(fù)習(xí) 八上 第3講 物態(tài)變化
- 2022年湖南財(cái)信金融控股集團(tuán)有限公司招聘筆試試題及答案解析
- 秩序維護(hù)人員的績效考核規(guī)范
評論
0/150
提交評論