Linux程序設(shè)計(jì)第7章_第1頁
Linux程序設(shè)計(jì)第7章_第2頁
Linux程序設(shè)計(jì)第7章_第3頁
Linux程序設(shè)計(jì)第7章_第4頁
Linux程序設(shè)計(jì)第7章_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

嵌入式操作系統(tǒng)應(yīng)用開發(fā)--Linux程序設(shè)計(jì)陳曉雷

第7章

信號(hào)處理7.1信號(hào)概念7.2

UNIX信號(hào)7.3生成信號(hào)7.4設(shè)置信號(hào)的動(dòng)作7.5信號(hào)句柄7.6阻塞信號(hào)7.7等待信號(hào)7.8使用分開的信號(hào)棧7.9信號(hào)句柄編程技巧7.10實(shí)時(shí)信號(hào)37.1信號(hào)概念信號(hào)是異步傳送給進(jìn)程的一種事件通知產(chǎn)生信號(hào)的原因(生成信號(hào)的事件)程序出錯(cuò)外部事件顯式請(qǐng)求同步信號(hào):與程序中的某個(gè)具體操作相關(guān)并且在那個(gè)操作進(jìn)行的同時(shí)產(chǎn)生異步信號(hào):進(jìn)程之外的事件生成的信號(hào)47.1信號(hào)概念信號(hào)發(fā)生時(shí),進(jìn)程采取的動(dòng)作忽略信號(hào):SIGSTOP、SIGKILL除外捕獲信號(hào):捕獲函數(shù)(句柄)對(duì)信號(hào)進(jìn)行專門的處理執(zhí)行系統(tǒng)默認(rèn)動(dòng)作流產(chǎn)Core:終止進(jìn)程,并且生成內(nèi)存轉(zhuǎn)儲(chǔ)文件core終止Term:終止進(jìn)程,不生成內(nèi)存轉(zhuǎn)儲(chǔ)文件忽略Ign:忽略信號(hào)掛起Stop:暫停進(jìn)程繼續(xù)Cont:暫停的進(jìn)程恢復(fù)執(zhí)行信號(hào)相關(guān)術(shù)語生成、發(fā)送、交付、接收、捕獲、懸掛、屏蔽字、阻塞7.2UNIX信號(hào)系統(tǒng)為每一種可能的事件定義了一種信號(hào),每種信號(hào)有一個(gè)信號(hào)數(shù),并對(duì)應(yīng)有信號(hào)名SIG/usr/include/signal.h=>asm/signal.hman7signalkill–l表7-1空信號(hào)0voidpsignal(intsigno,constchar*msg);57.2UNIX信號(hào)7.2.1程序錯(cuò)誤類信號(hào) 1797.2.2程序中止類信號(hào) 1807.2.3鬧鐘類信號(hào) 1807.2.4I/O類信號(hào) 1807.2.5作業(yè)控制類信號(hào) 1817.2.6操作錯(cuò)誤類信號(hào) 1817.2.7其他信號(hào)67.3生成信號(hào)硬件自陷、程序錯(cuò)誤終端控制字符和shell命令Ctrl-cstty–akill(1)函數(shù)abortalarm77.3生成信號(hào)7.3.1

raise()函數(shù)intraise(intsig);進(jìn)程給自己發(fā)送信號(hào)sigraise()會(huì)阻塞,句柄函數(shù)返回時(shí),才會(huì)返回7.3.2

kill()函數(shù)intkill(pid_t,intsig);發(fā)送信號(hào)給一個(gè)進(jìn)程或一組進(jìn)程參數(shù)pid>0:指定進(jìn)程pid==0:所在組的所有進(jìn)程進(jìn)程pid<-1:進(jìn)程組ID為pid絕對(duì)值pid==-1:廣播信號(hào),所有進(jìn)程例p7-1.c87.4設(shè)置信號(hào)的動(dòng)作7.4.1

signal()函數(shù)typedefvoid(*sighandler_t)(int);sighandler_tsignal(intsignum,sighandler_thandler);參數(shù)signum:handler:SIG_DFL:各種信號(hào)的默認(rèn)動(dòng)作SIG_IGN:忽略,SIGKILL、SIGSTOP不可

信號(hào)句柄:信號(hào)捕獲函數(shù)97.4設(shè)置信號(hào)的動(dòng)作7.4.1

signal()函數(shù)當(dāng)信號(hào)發(fā)生時(shí),如果建立了信號(hào)句柄系統(tǒng)在把控制轉(zhuǎn)到信號(hào)句柄之前將阻塞后續(xù)新的信號(hào)直至信號(hào)句柄完成為止--BSD改變信號(hào)的動(dòng)作為SIG_DFL—系統(tǒng)V(即一次性)Signal()的返回值—指向前一次有效動(dòng)作的指針出錯(cuò):SIG_ERR,errno=EINVAL例p7-2.c107.4設(shè)置信號(hào)的動(dòng)作7.4.2進(jìn)程初啟時(shí)的信號(hào)動(dòng)作fork()派生的子進(jìn)程:繼承父進(jìn)程的信號(hào)動(dòng)作,包括信號(hào)屏蔽、捕獲函數(shù),以及相關(guān)標(biāo)志由exec()加載的進(jìn)程:除調(diào)用進(jìn)程已設(shè)置為要忽略的信號(hào)之外,其他信號(hào)都將設(shè)置為默認(rèn)動(dòng)作應(yīng)用程序(shell->exec()):信號(hào)要么忽略,要么默認(rèn)動(dòng)作后臺(tái)進(jìn)程:忽略中斷和結(jié)束信號(hào)(SIGINT和SIGQUIT)signal()的局限性:無法單獨(dú)查看信號(hào)的當(dāng)前動(dòng)作不可靠117.4設(shè)置信號(hào)的動(dòng)作7.4.3不可靠信號(hào)

catch_sigquit() {

//存在時(shí)間窗,可能接收到SIGQUIT信號(hào),用默認(rèn)動(dòng)作處理,終止冰屑core文件 signal(SIGQUIT,catch_sigquit);//系統(tǒng)V … }main(){ signal(SIGQUIT,catch_sigquit); … }BSD擴(kuò)充了signal()系統(tǒng)調(diào)用,可以阻塞新到達(dá)的信號(hào)從而避免時(shí)間窗問題127.4設(shè)置信號(hào)的動(dòng)作7.4.4

sigaction()函數(shù)intsigaction(intsignum,conststructsigaction*act,structsigaction*oact);sigaction()用來檢查或指定與特定信號(hào)有關(guān)的動(dòng)作參數(shù)signum:除SIGHILL和SIGSTOP外的任何信號(hào)參數(shù)act:NULL或指定動(dòng)作參數(shù)oact:NULL或返回先前的動(dòng)作返回值:成功0,失敗-1structsigaction{ void(*sa_handler)();//傳統(tǒng)信號(hào)句柄、SIG_DFL、SIG_IGN void(*sa_sigaction)(int,siginfo_t*,void*);//另一信號(hào)句柄sigset_tsa_mask;//信號(hào)句柄執(zhí)行期間要阻塞的一組信號(hào)intsa_flags;//若干控制標(biāo)志組合}137.4設(shè)置信號(hào)的動(dòng)作7.4.4

sigaction()函數(shù)147.5信號(hào)句柄信號(hào)句柄—信號(hào)捕獲函數(shù),信號(hào)到達(dá)時(shí)調(diào)用兩種基本策略句柄函數(shù)僅做簡(jiǎn)單處理,設(shè)置標(biāo)志,正常返回對(duì)信號(hào)適當(dāng)處理,然后讓句柄終止程序運(yùn)行7.5.1正常返回的信號(hào)句柄用于此策略的信號(hào):SIGALRM、I/O、進(jìn)程通信的信號(hào)sig_atomic_t數(shù)據(jù)類型例:p7-4.c157.5信號(hào)句柄7.5.2終止進(jìn)程的句柄用于此策略的信號(hào):程序錯(cuò)誤信號(hào)和交互中斷信號(hào)句柄函數(shù)通常完成一次必要的清場(chǎng)工作、報(bào)告錯(cuò)誤、終止程序的運(yùn)行終止運(yùn)行的兩種方法:調(diào)用exit()或abort()設(shè)置信號(hào)默認(rèn)動(dòng)作,再次生成同一信號(hào)典型代碼167.6阻塞信號(hào)阻塞信號(hào)—操作系統(tǒng)保持該信號(hào)并推遲它的發(fā)送被阻塞的信號(hào)不會(huì)丟失,只是暫時(shí)懸掛,直到阻塞解除每個(gè)進(jìn)程有一個(gè)信號(hào)屏蔽字,它包含當(dāng)前被阻塞的信號(hào)的集合7.6.1

sigset_t類型和信號(hào)集操作sigset_t類型表示的信號(hào)集合只能用下屬五個(gè)函數(shù)來操作intsigemptyset(sigset_t*set);intsigfillset(sigset_t*set);intsigaddset(sigset_t*set,intsigno);intsigdelset(sigset_t*set,intsigno);intsigismember(sigset_t*set,intsigno);177.6阻塞信號(hào)7.6.2設(shè)置信號(hào)屏蔽信號(hào)屏蔽繼承于其父進(jìn)程改變信號(hào)屏蔽的途徑sigaction()—僅信號(hào)句柄執(zhí)行期間起作用sigprocmask()intsigprocmask(inthow,constsigset_t*set,sigset_t*oset);how:SIG_BLOCK、SIG_UNBLOCK、SIG_SETMASKset:NULL、新的信號(hào)集合oset:NULL、老的信號(hào)集合不能阻塞SIGKILL和SIGSTOP例:p7-5.c187.6阻塞信號(hào)7.6.3檢查懸掛信號(hào)懸掛信號(hào):已經(jīng)發(fā)生但由于阻塞環(huán)未交付的信號(hào)intsigpending(sigset_t*set);查看懸掛信號(hào)并存于set例:p7-6.c197.7等待信號(hào)等待信號(hào)方法忙等待pause()和sigsuspend()7.7.1

pause()函數(shù)intpause(void);懸掛調(diào)用進(jìn)程直到有信號(hào)到達(dá)返回-1并errno=EINTR使用簡(jiǎn)單,但不可靠分析代碼207.7等待信號(hào)7.7.2

sigsuspend()函數(shù)intsigsuspend(constsigset_t*sigmask);參數(shù)sigmask所指的信號(hào)集臨時(shí)替代調(diào)用進(jìn)程的信號(hào)屏蔽字,然后掛起調(diào)用進(jìn)程,直到有不屬于sigmask的信號(hào)到達(dá)為止返回-1并errno=EIN

溫馨提示

  • 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論