版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章Linux信號(hào)內(nèi)容提要信號(hào)概述Linux系統(tǒng)中的信號(hào)信號(hào)的定義發(fā)送信號(hào)信號(hào)文件7.1信號(hào)概述信號(hào)概述
信號(hào)是進(jìn)程對(duì)所發(fā)生事件的一種響應(yīng)模式,例如,數(shù)據(jù)溢出和定時(shí)器到期等,內(nèi)核預(yù)設(shè)了多種事件,為它們定義了相應(yīng)的信號(hào),并設(shè)置了對(duì)應(yīng)的信號(hào)處理方式;當(dāng)事件發(fā)生時(shí),進(jìn)程會(huì)收到相應(yīng)的信號(hào),進(jìn)程暫停運(yùn)行,轉(zhuǎn)而執(zhí)行對(duì)應(yīng)的信號(hào)處理程序,待信號(hào)處理完成,進(jìn)程從中斷點(diǎn)恢復(fù)運(yùn)行。通常,信號(hào)的發(fā)生具有異步性,它可能發(fā)生在進(jìn)程運(yùn)行過程中的任意時(shí)間點(diǎn),所以,信號(hào)也稱為一步信號(hào)。信號(hào)和中斷在概念上具有相似性,信號(hào)屬于操作系統(tǒng)的范疇,而中斷屬于處理器對(duì)外部設(shè)備事件的響應(yīng)方式。應(yīng)用編程接口分類API功能描述信號(hào)處理sigprocmask修改當(dāng)前進(jìn)程的信號(hào)掩碼sigaction定義信號(hào)的處理方式sigpending檢測(cè)到達(dá)的阻塞信號(hào)sigwaitinfo等待阻塞信號(hào)的到達(dá)發(fā)送信號(hào)kill向進(jìn)程發(fā)送信號(hào)abort向進(jìn)程發(fā)送SIGABRT信號(hào)sigqueue發(fā)送實(shí)時(shí)信號(hào)信號(hào)文件signalfd創(chuàng)建信號(hào)文件7.2Linux系統(tǒng)中的信號(hào)信號(hào)的分類標(biāo)準(zhǔn)信號(hào)標(biāo)準(zhǔn)信號(hào)源自Unix,信號(hào)編號(hào)以正整數(shù)表示,范圍從1至31,內(nèi)核僅用一位表示標(biāo)準(zhǔn)信號(hào),當(dāng)值為0,表示該位對(duì)應(yīng)的信號(hào)未發(fā)生,若值為1,表示該位對(duì)應(yīng)的信號(hào)已發(fā)生。實(shí)際時(shí)信號(hào)為彌補(bǔ)標(biāo)準(zhǔn)信號(hào)的某些不足,引入了實(shí)時(shí)信號(hào),信號(hào)編號(hào)從32至64,每個(gè)實(shí)時(shí)信號(hào)在內(nèi)核中用隊(duì)列表示,支持排隊(duì)和參數(shù)傳遞。信號(hào)編號(hào)值動(dòng)作含義SIGHUP1Term與終端的連接斷開SIGINT2Term終端中斷SIGQUIT3Core終端退出SIGILL4Core非法指令SIGABRT6Core中止進(jìn)程SIGFPE8Core浮點(diǎn)異常SIGKILL9Term殺死進(jìn)程(不可屏蔽)SIGSEGV11Core段非法錯(cuò)誤SIGPIPE13Term管道讀寫錯(cuò)誤SIGALRM14Term實(shí)時(shí)計(jì)時(shí)器到期SIGTERM15Term終止進(jìn)程SIGUSR130,10,16Term用戶自定義信號(hào)SIGUSR231,12,17Term用戶自定義信號(hào)SIGCHLD20,17,18Ign告知父進(jìn)程,子進(jìn)程終止SIGCONT19,18,25Cont若停止則繼續(xù)SIGSTOP17,19,23Stop停止進(jìn)程(不可屏蔽)SIGTSTP18,20,24Stop終端停止SIGTTIN21,21,26Stop后臺(tái)進(jìn)程從終端讀取標(biāo)準(zhǔn)信號(hào)信號(hào)編號(hào)值動(dòng)作含義SIGTTOU22,22,27Stop后臺(tái)進(jìn)程向終端寫SIGBUS10,7,10Core總線錯(cuò)誤SIGPROF27,27,29Term實(shí)用計(jì)時(shí)器到期SIGSYS12,31,12Core無效的系統(tǒng)調(diào)用SIGTRAP5Core跟蹤/斷點(diǎn)陷阱SIGURG16,23,21Ign套接字上的緊急數(shù)據(jù)SIGVTALRM26,26,28Term虛擬計(jì)時(shí)器到期SIGXCPU24,24,30CoreCPU時(shí)間限制超時(shí)SIGXFSZ25,25,31Core超過文件最大長度限制SIGIOT6Core與SIGABRT信號(hào)同義SIGEMT7,-,7Term模擬陷入SIGSTKFLT-,16,-Term協(xié)處理器錯(cuò)誤SIGIO23,29,22TermI/O可能產(chǎn)生SIGCLD-,-,18Ign與SIGCHLD信號(hào)同義SIGPWR29,30,19Term電量即將耗盡SIGINFO29,-,-與SIGPWR信號(hào)同義SIGLOST-,-,-Term文件鎖丟失(未使用)SIGWINCH28,28,20Ign終端窗口尺寸發(fā)生變化SIGUNUSED-,31,-CoreSIGSYS信號(hào)同義標(biāo)準(zhǔn)信號(hào)(續(xù))動(dòng)作類型含義Term結(jié)束進(jìn)程Ign忽略信號(hào)Core結(jié)束進(jìn)程并產(chǎn)生核心文件Stop暫停進(jìn)程運(yùn)行Cont恢復(fù)暫停進(jìn)程的運(yùn)行Linux信號(hào)的產(chǎn)生1.用戶信號(hào)在用戶與系統(tǒng)交互過程中產(chǎn)生,例如,當(dāng)用戶在鍵盤上輸入Ctrl+C和Ctrl+\時(shí),終端驅(qū)動(dòng)程序通知內(nèi)核將向目標(biāo)進(jìn)程發(fā)送信號(hào)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)的信號(hào)SIGIO。3.進(jìn)程一個(gè)進(jìn)程向另一個(gè)進(jìn)程發(fā)送信號(hào),例如,進(jìn)程通過調(diào)用kill函數(shù)向其他進(jìn)程發(fā)送信號(hào)。信號(hào)的處理方式1.異步處理模式默認(rèn)情況下,信號(hào)采用異步處理模式,信號(hào)可能發(fā)生在進(jìn)程運(yùn)行的任意時(shí)刻,當(dāng)信號(hào)發(fā)生時(shí),進(jìn)程暫停運(yùn)行,保存現(xiàn)場(chǎng),轉(zhuǎn)而執(zhí)行信號(hào)處理程序,待信號(hào)處理程序執(zhí)行完畢,恢復(fù)現(xiàn)場(chǎng),從中斷點(diǎn)繼續(xù)運(yùn)行。2.同步處理模式當(dāng)信號(hào)被阻塞時(shí),到達(dá)的信號(hào)不會(huì)馬上處理,而是處于等待狀態(tài),進(jìn)程可自主選擇時(shí)機(jī)進(jìn)行處理。信號(hào)的接收對(duì)象
在多線程環(huán)境下,線程共享進(jìn)程的信號(hào)處理方式,但信號(hào)掩碼各自獨(dú)立,線程可屏蔽各自不感興趣的信號(hào),信號(hào)的發(fā)送目標(biāo)可為進(jìn)程或線程,當(dāng)目標(biāo)為進(jìn)程時(shí),進(jìn)程中的線程均有機(jī)會(huì)處理到達(dá)的信號(hào),機(jī)會(huì)取決于進(jìn)程調(diào)度,當(dāng)目標(biāo)為線程時(shí),由接收信號(hào)的線程處理。信號(hào)的延遲
信號(hào)除因阻塞而被延遲處理外,在未阻塞的情況下,從信號(hào)的產(chǎn)生到處理,可能存在一定的延遲,信號(hào)處理取決于下一個(gè)調(diào)度時(shí)機(jī),例如,時(shí)間片耗盡后重新被選中、系統(tǒng)調(diào)用結(jié)束和中斷返回。7.3信號(hào)的定義信號(hào)掩碼
信號(hào)掩碼是由一組信號(hào)構(gòu)成的集合,當(dāng)屬于該集合的信號(hào)到達(dá)進(jìn)程時(shí),對(duì)信號(hào)不作任何處理,直至信號(hào)阻塞被解除,期間一直處于等待狀態(tài)。設(shè)置信號(hào)掩碼頭文件
#include<signal.h>函數(shù)原型
int
sigprocmask(inthow,constsigset_t*set,sigset_t*oldset);功能 重置進(jìn)程的信號(hào)掩碼。參數(shù)
how:操作方式。
set:新信號(hào)集。
oldset:替換的信號(hào)掩碼。返回值 成功,返回0,失敗,返回-1。信號(hào)處理的定義sigaction(1/3)頭文件
#include<signal.h>函數(shù)原型
int
sigaction(int
signum,conststruct
sigaction*act,struct
sigaction*oldact);功能 定義信號(hào)的行為。參數(shù)
signum:信號(hào)編號(hào)。
act:信號(hào)的處理方式。
oldact:原信號(hào)的處理方式。返回值 成功返回0,失敗返回-1。信號(hào)處理的定義sigaction(2/3)
struct
sigaction{ //信號(hào)處理函數(shù)
void(*sa_handler)(int); //攜帶更多參數(shù)的信號(hào)處理函數(shù)
void(*sa_sigaction)(int,siginfo_t*,void*); //信號(hào)處理期間的信號(hào)掩碼
sigset_t
sa_mask; //信號(hào)處理的更多特性
int
sa_flags; //glibc內(nèi)部使用
void(*sa_restorer)(void);};信號(hào)處理的定義sigaction(3/3)siginfo_t{
int
si_signo;//信號(hào)編號(hào)
int
si_errno;//錯(cuò)誤值
int
si_code;//信號(hào)來源的詳細(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)程消耗的用戶時(shí)間
clock_t
si_stime;//進(jìn)程消耗的系統(tǒng)時(shí)間
sigval_t
si_value;//信號(hào)傳遞的參數(shù)
int
si_overrun;//定時(shí)器溢出次數(shù)
int
si_timerid;//POSIX.1b定時(shí)器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á)的阻塞信號(hào)
當(dāng)位于信號(hào)掩碼的信號(hào)到達(dá)進(jìn)程時(shí),信號(hào)被阻塞,直至阻塞解除,期間信號(hào)處于阻塞狀態(tài)。可分別通過sigpending和sigwaitinfo函數(shù)檢測(cè)到達(dá)的阻塞信號(hào)和同步等待排隊(duì)的信號(hào)。sigpending函數(shù)頭文件
#include<signal.h>函數(shù)原型
int
sigpending(sigset_t*set);功能 檢測(cè)到達(dá)的阻塞信號(hào)。參數(shù)
Set:指向到達(dá)的阻塞信號(hào)。返回值 成功,返回0,失敗,返回-1。sigwaitinfo函數(shù)頭文件
#include<signal.h>函數(shù)原型
int
sigwaitinfo(const
sigset_t*set,siginfo_t*info);功能 等待阻塞信號(hào)的到達(dá)。參數(shù)
set:等待的阻塞信號(hào)。
info:到達(dá)的阻塞信號(hào)。返回值 成功,返回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ā)送信號(hào)發(fā)送標(biāo)準(zhǔn)信號(hào)頭文件
#include<sys/types.h #include<signal.h>函數(shù)原型
int
kill(pid_t
pid,int
sig);;功能 向進(jìn)程發(fā)送信號(hào)。參數(shù)
pid:進(jìn)程ID。
sig:信號(hào)編號(hào)。返回值 調(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í)時(shí)信號(hào)sigqueue函數(shù)頭文件
#include<sys/types.h> #include<signal.h>函數(shù)原型
int
sigqueue(pid_t
pid,int
sig,constunionsigval
val);功能 向進(jìn)程發(fā)送實(shí)時(shí)信號(hào)。參數(shù)
pid:目標(biāo)進(jìn)程ID。
sig:實(shí)時(shí)信號(hào)編號(hào)。
val:傳遞的參數(shù)。返回值 成功返回0;失敗返回-1。發(fā)送實(shí)時(shí)信號(hào)
sigqueue函數(shù)向進(jìn)程pid發(fā)送實(shí)時(shí)新號(hào)sig,并攜帶參數(shù)val,val為sigval類型指針,sigval類型的定義如下。typedefunionsigval{
int
sival_int; //用于傳送一個(gè)整型數(shù)
void*sival_ptr; //指向參數(shù)地址
}sigval_t;
sigqueue函數(shù)基于rt_sigqueueinfo系統(tǒng)調(diào)用實(shí)現(xiàn),接收實(shí)時(shí)信號(hào)的進(jìn)程需通過sigaction函數(shù)的SA_SIGINFO選項(xiàng)定義信號(hào)處理函數(shù),以便接收信號(hào)和攜帶的數(shù)據(jù)。7.5信號(hào)文件信號(hào)文件
信號(hào)文件是一種將到達(dá)的信號(hào)作為字節(jié)流的特殊文件。
Linux內(nèi)核自2.6.22引入了一種非標(biāo)準(zhǔn)的系統(tǒng)調(diào)用接口eventfd、signalfd和timerfd,它們將事件、信號(hào)和到期時(shí)間抽象為字節(jié)流,其中signalfd便是信號(hào)文件的應(yīng)用編程接口。信號(hào)文件signalfd函數(shù)頭文件
#include<sys/signalfd.h>函數(shù)原型
int
signalfd(int
fd,constsigset_t*mask,intflags);功能 創(chuàng)建信號(hào)文件。參數(shù)
fd:文件描述符。
mask:監(jiān)聽的信號(hào)集。
flags:打開方式。返回值 成功:返回文件描述符,失敗,返回-1。信號(hào)文件(續(xù))struct
signalfd_siginfo{uint32_tssi_signo;//信號(hào)編號(hào)
int32_tssi_errno;//錯(cuò)誤碼(未使用
int32_tssi_code;//信號(hào)碼
uint32_tssi_pid;//發(fā)送進(jìn)程IDuint32_tssi_uid;//發(fā)送用戶實(shí)際IDint32_tssi_fd;//文件描述符(SIGIO)uint32_tssi_tid;//內(nèi)核定時(shí)器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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村離婚協(xié)議書撰寫指南
- 2024年水面承包合同范文
- 園林工程維保合同樣本
- 2024年店鋪權(quán)益轉(zhuǎn)讓協(xié)議書
- 個(gè)人使用版房屋買賣合同樣本
- 建筑設(shè)備升降機(jī)租賃協(xié)議
- 大學(xué)實(shí)習(xí)生的就業(yè)協(xié)議書范例
- 2024年食品運(yùn)輸合同范本
- 離婚協(xié)議書范本及填寫指南
- 2024年程序員聘用勞動(dòng)合同
- 建設(shè)項(xiàng)目“三同時(shí)”環(huán)境保護(hù)驗(yàn)收一覽表
- 箱涵清淤專項(xiàng)施工方案
- 年金險(xiǎn)的銷售邏輯課件
- 2023年沈陽桃仙國際機(jī)場(chǎng)股份有限公司招聘筆試模擬試題及答案解析
- 【2022】外研版英語八年級(jí)上冊(cè)知識(shí)點(diǎn)總結(jié)(精華版)
- 三年級(jí)上冊(cè)數(shù)學(xué)課件-《乘火車》 北師大版 (共25張PPT)
- 勞動(dòng)法律法規(guī)培訓(xùn) 課件
- 基于綜合實(shí)踐活動(dòng)的德育校本課程開發(fā)與實(shí)施優(yōu)秀獲獎(jiǎng)科研論文
- 數(shù)字政府建設(shè)工作總結(jié)自查報(bào)告
- 中英文Bimco標(biāo)準(zhǔn)船舶管理協(xié)議--Shipman 2009
- 土木工程施工安全風(fēng)險(xiǎn)與管理措施探究
評(píng)論
0/150
提交評(píng)論