研一下課程信號_第1頁
研一下課程信號_第2頁
研一下課程信號_第3頁
研一下課程信號_第4頁
研一下課程信號_第5頁
已閱讀5頁,還剩20頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

信號引言信號是軟件中斷信號提供了一種處理異步事件的方法信號機制存在兩種不同時期的版本,一種是不可靠信號機制,另一種是可靠的信號機制信號概念信號在內核中用一個整數編號表示C程序中,信號有一個名字,以“SIG”開頭現代Unix系統支持多達30多種不同類型的信號產生信號的原因當用戶按某些終端鍵時硬件異常進程調用kill系統調用當檢測到某種軟件條件已經發生進程收到信號后的動作忽略此信號捕捉信號,執行一個函數執行系統默認動作忽略暫停終止終止+core常用的一些信號SIGABRT進程異常終止SIGALRM鬧鐘超時SIGBUS硬件故障SIGCHLD子進程終止SIGCONT停止的進程繼續SIGINT按中斷鍵SIGIO有異步IO事件SIGKILL可靠殺死進程SIGQUIT按退出鍵SIGSEGV無效內存訪問(段違例)SIGSTOP停止運行的進程SIGSYS無效的系統調用SIGTERM終止進程(kill默認發出的信號)SIGUSR用戶自定義信號SIGXCPU進程超軟CPU限制關于core文件有些信號的默認動作是“終止+core”,表示,終止進程,并且產生進程coredumpcore文件是進程的內存映像信息,通過core文件可以對原進程進行調試,找出進程終止的具體原因signal函數signal函數是Unix系統提供的信號機制的最簡單的接口void(*signal(intsigno,void(*func)(int)))(int);signal將用自定義的信號處理函數替換指定的信號的處理函數這個函數定義得非常簡單,沒有考慮很多問題,是一種不可靠的信號處理方式一種簡單的寫法typedefvoidsigfunc(int);

sigfuncsignal(int,sigfunc);一段典型代碼typedefvoidsigfunc(int);staticvoidhandler(intsigno){if(signo==SIGUSR1)printf(“........”);.......}intmain(){sigfunc*old_handler=signal(SIGUSR1,handler);pause();......}信號引入所面臨的幾個問題不可靠的信號中斷的系統調用函數的重入不可靠的信號信號可能會丟失,一個信號發生了,但進程卻一直不知道同時,進程對信號的控制能力也很弱,它只能捕捉信號或忽略它,但不能阻塞延緩信號一段有問題的代碼intsig_int(int);...signal(SIGINT,sig_int);...intsig_int(intsigno){signal(SIGINT,sig_int);/*再次設置處理函數*/...}早期版本signal的一個問題是,每次接收到信號對其處理時,隨即將信號動作恢復為默認動作從信號發生之后,到信號處理程序中再次調用signal函數之前,這段時間中有一個時間窗口。在此時間窗口中,可能會發生另外一次信號,而第二個信號會導致默認動作中斷的系統調用早期Unix系統的一個特性是:如果進程在執行一個低速系統調用,而阻塞期間捕捉到一個信號,則該系統調用就被中斷不再繼續執行,返回一個特定的錯誤信息EINTR系統調用被分為低速系統調用和其他系統調用,低速系統調用可能使進程永遠阻塞讀某類文件(比如管道、終端、網絡)寫這類文件打開某些類型文件(比如終端)pause、wait等函數某些進程間通信系統調用的自動重啟中斷的系統調用需要程序員在應用程序中處理為了幫助應用程序使其不必處理被中斷的系統調用,Unix系統中引入了系統調用的自動重啟注意:不同的系統對系統調用的自動重啟的配置是不一樣的函數的可重入問題進程捕捉到信號并對其進行處理時,進程正在執行的指令序列就被信號處理程序臨時打斷,它首先執行改信號處理函數中的指令,并且在信號處理函數執行完畢后繼續執行被打斷的主程序。如果主程序正在調用某些函數,而信號處理函數也調用這類函數,就出現了函數的重入問題。重入可能破壞函數內部的數據結構,導致錯誤。函數能否重入?很多函數都是不可重入的,也有一些函數是可重入的。函數不可重入的原因函數使用了靜態數據結構函數調用了malloc和free可靠的信號首先,內核或者進程產生了一個信號然后,內核將信號遞送給目標進程在信號產生到被遞送之間的時間間隔內,信號是未決的進程可以選用信號遞送阻塞內核在遞送一個原來被阻塞的信號時,才決定對它的處理方式進程在信號遞送給它之前仍可改變對信號的動作每個進程有一個信號屏蔽字定義了對哪些信號阻塞sigprocmask函數sigprocmask函數可以檢測和更改進程的信號屏蔽字intsigprocmask(inthow,sigset_t*set,sigset_toset);如果oset非空,那么當前屏蔽字通過oset返回如果set非空,那么how指示如何修改信號屏蔽字sigpending函數sigpending函數返回信號集,其中的各個信號對于調用進程是阻塞的而不能遞送,因而也一定是當前未決的。intsigpending(sigset_t*set);sigaction函數sigaction函數檢查或修改與指定信號相關聯的處理動作sigaction替代了Unix早期版本使用的signal函數intsigaction(intsigno,structsigaction*act,sturctsigaction*oact);若act非空,則修改指定信號動作若oact非空,則返回該信號的上一個動作信號處理中需要注意的問題voidsig_alarm(intsigno){/*donothing*/}voidsleep1(unsignedseconds){signal(SIGALRM,sig_alarm);alarm(seconds);pause();}在alarm和pause之間存在競爭條件,可能到導致函數永遠不能結束jmp_bufenv_alarm;voidsig_alarm(intsigno){longjmp(env_a

溫馨提示

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

評論

0/150

提交評論