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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

第7章

信號處理7.1信號概念7.2

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

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

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

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

信號句柄:信號捕獲函數(shù)97.4設置信號的動作7.4.1

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

catch_sigquit() {

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論