版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第7章Linux信號內(nèi)容提要信號概述Linux系統(tǒng)中的信號信號的定義發(fā)送信號信號文件7.1信號概述信號概述
信號是進程對所發(fā)生事件的一種響應模式,例如,數(shù)據(jù)溢出和定時器到期等,內(nèi)核預設(shè)了多種事件,為它們定義了相應的信號,并設(shè)置了對應的信號處理方式;當事件發(fā)生時,進程會收到相應的信號,進程暫停運行,轉(zhuǎn)而執(zhí)行對應的信號處理程序,待信號處理完成,進程從中斷點恢復運行。通常,信號的發(fā)生具有異步性,它可能發(fā)生在進程運行過程中的任意時間點,所以,信號也稱為一步信號。信號和中斷在概念上具有相似性,信號屬于操作系統(tǒng)的范疇,而中斷屬于處理器對外部設(shè)備事件的響應方式。應用編程接口分類API功能描述信號處理sigprocmask修改當前進程的信號掩碼sigaction定義信號的處理方式sigpending檢測到達的阻塞信號sigwaitinfo等待阻塞信號的到達發(fā)送信號kill向進程發(fā)送信號abort向進程發(fā)送SIGABRT信號sigqueue發(fā)送實時信號信號文件signalfd創(chuàng)建信號文件7.2Linux系統(tǒng)中的信號信號的分類標準信號標準信號源自Unix,信號編號以正整數(shù)表示,范圍從1至31,內(nèi)核僅用一位表示標準信號,當值為0,表示該位對應的信號未發(fā)生,若值為1,表示該位對應的信號已發(fā)生。實際時信號為彌補標準信號的某些不足,引入了實時信號,信號編號從32至64,每個實時信號在內(nèi)核中用隊列表示,支持排隊和參數(shù)傳遞。信號編號值動作含義SIGHUP1Term與終端的連接斷開SIGINT2Term終端中斷SIGQUIT3Core終端退出SIGILL4Core非法指令SIGABRT6Core中止進程SIGFPE8Core浮點異常SIGKILL9Term殺死進程(不可屏蔽)SIGSEGV11Core段非法錯誤SIGPIPE13Term管道讀寫錯誤SIGALRM14Term實時計時器到期SIGTERM15Term終止進程SIGUSR130,10,16Term用戶自定義信號SIGUSR231,12,17Term用戶自定義信號SIGCHLD20,17,18Ign告知父進程,子進程終止SIGCONT19,18,25Cont若停止則繼續(xù)SIGSTOP17,19,23Stop停止進程(不可屏蔽)SIGTSTP18,20,24Stop終端停止SIGTTIN21,21,26Stop后臺進程從終端讀取標準信號信號編號值動作含義SIGTTOU22,22,27Stop后臺進程向終端寫SIGBUS10,7,10Core總線錯誤SIGPROF27,27,29Term實用計時器到期SIGSYS12,31,12Core無效的系統(tǒng)調(diào)用SIGTRAP5Core跟蹤/斷點陷阱SIGURG16,23,21Ign套接字上的緊急數(shù)據(jù)SIGVTALRM26,26,28Term虛擬計時器到期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信號同義標準信號(續(xù))動作類型含義Term結(jié)束進程Ign忽略信號Core結(jié)束進程并產(chǎn)生核心文件Stop暫停進程運行Cont恢復暫停進程的運行Linux信號的產(chǎn)生1.用戶信號在用戶與系統(tǒng)交互過程中產(chǎn)生,例如,當用戶在鍵盤上輸入Ctrl+C和Ctrl+\時,終端驅(qū)動程序通知內(nèi)核將向目標進程發(fā)送信號SIGINT和SIGQUIT。2.內(nèi)核內(nèi)核在執(zhí)行過程中產(chǎn)生,例如,異步I/O模式下,I/O狀態(tài)就緒,內(nèi)核向目標進程發(fā)送相應的信號SIGIO。3.進程一個進程向另一個進程發(fā)送信號,例如,進程通過調(diào)用kill函數(shù)向其他進程發(fā)送信號。信號的處理方式1.異步處理模式默認情況下,信號采用異步處理模式,信號可能發(fā)生在進程運行的任意時刻,當信號發(fā)生時,進程暫停運行,保存現(xiàn)場,轉(zhuǎn)而執(zhí)行信號處理程序,待信號處理程序執(zhí)行完畢,恢復現(xiàn)場,從中斷點繼續(xù)運行。2.同步處理模式當信號被阻塞時,到達的信號不會馬上處理,而是處于等待狀態(tài),進程可自主選擇時機進行處理。信號的接收對象
在多線程環(huán)境下,線程共享進程的信號處理方式,但信號掩碼各自獨立,線程可屏蔽各自不感興趣的信號,信號的發(fā)送目標可為進程或線程,當目標為進程時,進程中的線程均有機會處理到達的信號,機會取決于進程調(diào)度,當目標為線程時,由接收信號的線程處理。信號的延遲
信號除因阻塞而被延遲處理外,在未阻塞的情況下,從信號的產(chǎn)生到處理,可能存在一定的延遲,信號處理取決于下一個調(diào)度時機,例如,時間片耗盡后重新被選中、系統(tǒng)調(diào)用結(jié)束和中斷返回。7.3信號的定義信號掩碼
信號掩碼是由一組信號構(gòu)成的集合,當屬于該集合的信號到達進程時,對信號不作任何處理,直至信號阻塞被解除,期間一直處于等待狀態(tài)。設(shè)置信號掩碼頭文件
#include<signal.h>函數(shù)原型
int
sigprocmask(inthow,constsigset_t*set,sigset_t*oldset);功能 重置進程的信號掩碼。參數(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;//信號來源的詳細信息
pid_t
si_pid;//進程ID
uid_t
si_uid;//進程所屬實際用戶ID
int
si_status;//進程的結(jié)束狀態(tài)
clock_t
si_utime;//進程消耗的用戶時間
clock_t
si_stime;//進程消耗的系統(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)的文件描述符...}實例分析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",);}
到達的阻塞信號
當位于信號掩碼的信號到達進程時,信號被阻塞,直至阻塞解除,期間信號處于阻塞狀態(tài)。可分別通過sigpending和sigwaitinfo函數(shù)檢測到達的阻塞信號和同步等待排隊的信號。sigpending函數(shù)頭文件
#include<signal.h>函數(shù)原型
int
sigpending(sigset_t*set);功能 檢測到達的阻塞信號。參數(shù)
Set:指向到達的阻塞信號。返回值 成功,返回0,失敗,返回-1。sigwaitinfo函數(shù)頭文件
#include<signal.h>函數(shù)原型
int
sigwaitinfo(const
sigset_t*set,siginfo_t*info);功能 等待阻塞信號的到達。參數(shù)
set:等待的阻塞信號。
info:到達的阻塞信號。返回值 成功,返回0,失敗,返回-1。
實例分析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ā)送標準信號頭文件
#include<sys/types.h #include<signal.h>函數(shù)原型
int
kill(pid_t
pid,int
sig);;功能 向進程發(fā)送信號。參數(shù)
pid:進程ID。
sig:信號編號。返回值 調(diào)用成功返回0,否則返回-1。參數(shù)pid含義pd>0目標進程的ID為pidpid=0調(diào)用者進程所屬組中的所有進程pid=-1除初始化進程init外,有權(quán)發(fā)送的所有進程pid<-1進程組ID為-pid的所有進程發(fā)送實時信號sigqueue函數(shù)頭文件
#include<sys/types.h> #include<signal.h>函數(shù)原型
int
sigqueue(pid_t
pid,int
sig,constunionsigval
val);功能 向進程發(fā)送實時信號。參數(shù)
pid:目標進程ID。
sig:實時信號編號。
val:傳遞的參數(shù)。返回值 成功返回0;失敗返回-1。發(fā)送實時信號
sigqueue函數(shù)向進程pid發(fā)送實時新號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)用實現(xiàn),接收實時信號的進程需通過sigaction函數(shù)的SA_SIGINFO選項定義信號處理函數(shù),以便接收信號和攜帶的數(shù)據(jù)。7.5信號文件信號文件
信號文件是一種將到達的信號作為字節(jié)流的特殊文件。
Linux內(nèi)核自2.6.22引入了一種非標準的系統(tǒng)調(diào)用接口eventfd、signalfd和timerfd,它們將事件、信號和到期時間抽象為字節(jié)流,其中signalfd便是信號文件的應用編程接口。信號文件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ā)送進程IDuint32_tssi_uid;//發(fā)送用戶實際IDint32_tssi_fd;//文件描述符(SIGIO)uint32_tssi_tid;//內(nèi)核定時器IDuint32_tssi_band;//I/O事件(SIGIO)*/......uint8_tpad[X];//擴充成員變量};參數(shù)flags
含義SFD_NONBLOCK非阻塞方式讀寫文件SFD_CLOEXEC設(shè)置close-on-exec選項signalfd函數(shù)中參數(shù)flags的定義實例分析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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 科研機構(gòu)行業(yè)實驗室安全保障
- 咨詢服務保安員工作總結(jié)
- 公司注冊代理合同三篇
- 動漫游戲行業(yè)會計的特點總結(jié)
- 2023年浙江省杭州市公開招聘警務輔助人員輔警筆試自考題2卷含答案
- 《合理使用中成藥》課件
- 高三學習計劃書
- 河北省唐山市(2024年-2025年小學六年級語文)統(tǒng)編版隨堂測試(下學期)試卷及答案
- 2024年防沉劑項目資金籌措計劃書
- 顧客檢查表(完整版)
- 世界職業(yè)院校技能大賽高職組“關(guān)務實務組”賽項參考試題及答案
- 高中歷史教師資格考試面試試題及解答參考(2024年)
- 北師大版(2024新版)生物七年級上冊期末考點復習提綱
- 期末 試題 -2024-2025學年人教PEP版英語六年級上冊 (含答案)
- 2024年理論中心組學習心得體會模版(2篇)
- 浙江省杭州市2023-2024學年六年級上學期語文期末試卷(含答案)
- 環(huán)保行業(yè)工業(yè)廢氣污染防治技術(shù)路線方案
- 電工的職業(yè)健康培訓
- 《預防性侵害講座》課件
- 2024年中國船舶涂料市場調(diào)查研究報告
- 體能準備活動與放松
評論
0/150
提交評論