




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、信號概述本講大綱:在在終終端中端中查查看常看常見見的信的信號號信信號處號處理理在終端中查看常見的信號 在在LinuxLinux這個多用戶多進程的系統中,信號的存在是必然的,這個多用戶多進程的系統中,信號的存在是必然的,信號可以理解為一個軟中斷,在某個條件下,系統會發出某個信信號可以理解為一個軟中斷,在某個條件下,系統會發出某個信號給正在運行的進程,通知進程需要去執行某一特定的事件。號給正在運行的進程,通知進程需要去執行某一特定的事件。在前面的進程控制一章中,介紹了在終端中可以使用在前面的進程控制一章中,介紹了在終端中可以使用killkill命令查看命令查看LinuxLinux系統中所支持的信號
2、,這些信號都是以系統中所支持的信號,這些信號都是以SIGSIG開頭的,接下來開頭的,接下來對對LinuxLinux系統中常見的信號進行介紹。系統中常見的信號進行介紹。11.1.1 在終端中查看常見的信號 在終端中輸入命令在終端中輸入命令“kill l”kill l”可以列出可以列出LinuxLinux系統中的所有信號系統中的所有信號,如圖,如圖11.111.1所示。所示。說明:圖說明:圖11.111.1中,每一個信號類型前面都有一個正整數,中,每一個信號類型前面都有一個正整數,這個正整數與信號代表相同的含義,稱之為信號編號。這個正整數與信號代表相同的含義,稱之為信號編號。 信號的宏定義和編號都
3、定義在信號的宏定義和編號都定義在signal.hsignal.h頭文件中。在終端中可頭文件中。在終端中可以通過輸入命令以通過輸入命令“man 7 signal”man 7 signal”查看查看LinuxLinux系統中支持的信號的系統中支持的信號的詳細含義,如圖詳細含義,如圖11.211.2所示。所示。信號處理 信號作為一種進程間通信的機制,主要用于處理異步事件,通信號作為一種進程間通信的機制,主要用于處理異步事件,通常如果有信號發送到正在執行的進程中時,進程會有如下常如果有信號發送到正在執行的進程中時,進程會有如下3 3種處理種處理信號的方法:信號的方法:(1 1)默認信號的處理方法,系統
4、為每一個信號都設置了默認的處)默認信號的處理方法,系統為每一個信號都設置了默認的處理方法,通常為終止進程。理方法,通常為終止進程。(2 2)捕捉信號,使進程執行指定的程序代碼。)捕捉信號,使進程執行指定的程序代碼。(3 3)忽略信號,對該信號不做任何處理。進程繼續執行。)忽略信號,對該信號不做任何處理。進程繼續執行。這這3 3種處理捕捉到的信號的方法只是比較基本的方法,在實際應用種處理捕捉到的信號的方法只是比較基本的方法,在實際應用中,對信號的處理并不會這么單一,例如,有些進程在執行時不中,對信號的處理并不會這么單一,例如,有些進程在執行時不希望被信號突然打斷,但是還不希望忽略此信號,此時進程
5、會將希望被信號突然打斷,但是還不希望忽略此信號,此時進程會將該信號掛起,在需要時在處理該信號。該信號掛起,在需要時在處理該信號。產生信號本講大綱:kill()kill()函函數數raise()raise()函函數數alarm()alarm()函函數數kill()函數前面介紹的在終端中通過前面介紹的在終端中通過killkill命令產生信號的方法,原理主要是命令產生信號的方法,原理主要是killkill命令調用了命令調用了kill()kill()函數實現了這個功能。函數實現了這個功能。kill()kill()函數主要用于向指定的進程或進程組發送信號,該函數的定義形式為:函數主要用于向指定的進程或進
6、程組發送信號,該函數的定義形式為:#include#include#include#includeInt kill(pid_t pid,int sig);Int kill(pid_t pid,int sig);參數參數pidpid為進程號或進程組號;參數為進程號或進程組號;參數sigsig為要發送的信號類型的編號。為要發送的信號類型的編號。參數參數pidpid的取值范圍不同,發送的信號觸發的事件也是不同的,其取值范圍如下:的取值范圍不同,發送的信號觸發的事件也是不同的,其取值范圍如下: pid=0pid=0:將信號發送到當前進程所在的進程組里的每一個進程。:將信號發送到當前進程所在的進程組里的
7、每一個進程。 pid=-1pid=-1:將信號發送給除了:將信號發送給除了initinit進程外的當前進程中有權發送的所有進進程外的當前進程中有權發送的所有進程。程。 pid-1pid-1:將信號發送給進程組(:將信號發送給進程組(-pid-pid)中的每一個進程。)中的每一個進程。 如果如果pidpid為一個有效的進程或進程組號,信號將發送給為一個有效的進程或進程組號,信號將發送給pidpid所代表的進程所代表的進程或進程組。或進程組。& &說明:如果參數說明:如果參數sigsig為為0 0,就沒有信號可以發送,但會進行錯誤檢查。,就沒有信號可以發送,但會進行錯誤檢查。raise()函數ra
8、ise()raise()函函數數主要用于主要用于將將信信號發號發送送給當給當前前進進程。程。raise()raise()函函數數的原型的原型為為:#include#includeInt raise(int sig);Int raise(int sig);參數參數sigsig為發送的信號類型的編號。為發送的信號類型的編號。如果函數調用成功,返回值為如果函數調用成功,返回值為0 0;如果調用失敗,返回值為非;如果調用失敗,返回值為非0 0。說明:由說明:由raise()raise()函數的功能可以知道,使用函數的功能可以知道,使用kill()kill()函數也函數也可以實現這一功能,如可以實現這一
9、功能,如kill(getpid(),sig)kill(getpid(),sig)。alarm()函數alarm()alarm()函函數數主要用于主要用于為發為發送的信送的信號設號設定一定一個時間個時間警告,使系警告,使系統統在在設設定的定的時間時間之后之后發發送信送信號號。alarm()alarm()函函數數的原型的原型為為:#include#includeunsigned int alarm(unsigned int seconds);unsigned int alarm(unsigned int seconds);參數參數secondsseconds為設定的時間值。如果為設定的時間值。如果
10、secondsseconds設置為設置為0 0值,那么值,那么alarm()alarm()函數設置的警告時鐘將無效。函數設置的警告時鐘將無效。alarm()alarm()函數安排在函數安排在secondsseconds時間之后,發送一個信號時間之后,發送一個信號SIGALRMSIGALRM給進程。在默認的情況下,進程接收到給進程。在默認的情況下,進程接收到SIGALRMSIGALRM信號會終止運行信號會終止運行。如果不希望終止進程,可以在進程捕獲到該信號后修改默認的。如果不希望終止進程,可以在進程捕獲到該信號后修改默認的處理函數。處理函數。調用調用alarm()alarm()函數后,之前設置的
11、任何警告時鐘都取消。函數后,之前設置的任何警告時鐘都取消。標題捕捉信號本講大綱:signal()signal()函函數數sigaction()sigaction()函函數數signal()函數在前面信號的介紹中,了解到有3種對信號的處理方法,一種是系統對信號的默認處理方法;一種是忽略信號;還有一種是捕獲信號。其實對于忽略信號和捕獲信號,都是修改系統默認信號的處理方法。在Linux系統中,可以使用signal()函數和sigaction()函數對默認的信號處理方法進行修改,接下來對這兩個函數進行詳細講解。11.3.1 signal()函數signal()函數用于修改某個信號的處理方法,該函數的定
12、義形式如下:#includetypedef void(*sogjamd;er_t)(int);sighandler_t signal(int signum,sighandler_t handler);參數signum代表信號類型的編號;參數handler代表指向信號新的處理方法的指針,如果指針指向一個函數,那么捕捉到signum信號時,會執行這個特殊函數處理信號;參數handler還可以設置為SIG_IGN或SIG_DFL,SIG_IGN代表忽略該信號,而SIG_DFL代表采用默認的處理方法。使用一個自己定義的特殊函數作為信號的處理方法,這種處理信號的方法叫做“捕捉信號”。U注意:在系統提供的
13、信號類型中,SIGKILL和SIGSTOP信號不能被捕獲或者忽略。signal()函數調用成功時,返回先前的信號,處理調用的函數指針;調用失敗時,返回SIG_ERR。例11.1 結合前面介紹的產生信號的函數,產生不同的信號,通過signal()函數捕捉信號,掌握signal()函數的使用方法。(實例位置:光盤TMsl111)#include#include#includevoid sigint(int sig);void sigcont(int sig);int main(void)char a100;if(signal(SIGINT,&sigint)=SIG_ERR)/修改SIGINT信號的
14、處理方法為sigint()函數perror(sigint signal error!);sigaction()函數sigaction()函數主要用于讀取和修改指定信號的處理動作。該函數的定義形式為:#includeInt sigaction(int signum,const struct sigaction *act,struct sigaction *oldact);參數signum表示要捕獲信號類型的編號,參數act和oldact都是指向sigaction結構體類型的指針。參數act表示需要修改的指定的新的處理動作,而該信號的原有處理動作保存到參數oldact指向的緩沖區中。U注意:如果兩
15、個sigaction結構體類型的指針act和oldact都指向空,則兩個指針參數不會實現上述功能。結構體類型sigaction的定義形式如下:struct sigactionvoid(*sa_handler)(int);void(*sa_sigaction)(int ,siginfo_t *,void *);sigset_t sa_mask;int sa_flags;void(*sa_restorer)(void);如果將上述結構體中的成員sa_handler設置為SIG_IGN,表示忽略信號;設置為SIG_DFL,表示執行系統默認的處理動作;設置為一個函數指針的話,表示用自定義處理函數捕捉信
16、號,也可以稱之為向內核注冊了一個信號處理函數。這個自定義的信號處理函數的返回值為void,可以傳遞一個int參數,表示要處理的信號類型的編號,這樣就可以通過調用一個函數執行多種信號的處理動作。只是這個函數并不是被主函數main()所調用而是被系統所調用。例11.2 調用sigaction()函數修改SIGINT信號的處理方法,修改為顯示接收到的信號編號,并累加計時,直到接收到下一個信號的到來。(實例位置:光盤TMsl112)程序的代碼如下:#include #include #include int i=0;標題信號的阻塞本講大綱:sigprocmask()sigprocmask()函函數數s
17、igsuspend()sigsuspend()函函數數sigpending()sigpending()函函數數sigprocmask()函數在前面介紹信號處理時,提到了信號的處理并沒有那么的簡單,而是有的時候進程并不希望被突如在前面介紹信號處理時,提到了信號的處理并沒有那么的簡單,而是有的時候進程并不希望被突如其來的信號中斷當前的執行,也不希望信號從此被忽略掉,而是希望過一段時間之后再去處理這個其來的信號中斷當前的執行,也不希望信號從此被忽略掉,而是希望過一段時間之后再去處理這個信號,這種情況下,可以使用阻塞信號的方法來實現。能夠實現信號阻塞的操作有信號,這種情況下,可以使用阻塞信號的方法來實
18、現。能夠實現信號阻塞的操作有3 3個系統調用函個系統調用函數,分別是數,分別是sigprocmask()sigprocmask()函數、函數、sigsuspend()sigsuspend()函數和函數和sigpending()sigpending()函數,下面分別對它們進行詳函數,下面分別對它們進行詳細講解。細講解。說明:信號屏蔽字就是進程中被阻塞的信號集,這些信號不能發送給該進程,它們在該說明:信號屏蔽字就是進程中被阻塞的信號集,這些信號不能發送給該進程,它們在該進程中被進程中被 屏蔽屏蔽 了,也就是被阻塞了。了,也就是被阻塞了。11.4.1 sigprocmask()函數sigprocma
19、sk()sigprocmask()函函數數可用于可用于檢測檢測和改和改變進變進程的信程的信號號掩掩碼碼,該該函函數數的定的定義義形式如下:形式如下:#include#includeInt sigprocmask(int how,const sigset_t Int sigprocmask(int how,const sigset_t * *newset,sigset_t newset,sigset_t * *oldset);oldset);sigprocmask()sigprocmask()函函數數有有3 3個參數個參數,參數參數howhow表示修改信表示修改信號屏號屏蔽字的方式;蔽字的方式;
20、參數參數newsetnewset表示把表示把這個這個信信號號集集設為設為新的新的當當前信前信號屏號屏蔽字,如果蔽字,如果為為NULLNULL則則不改不改變變;參數參數oldsetoldset表示保存表示保存進進程程舊舊的信的信號屏號屏蔽字蔽字,如果,如果為為NULLNULL則則不保存。不保存。參數參數howhow的取的取值值不同不同帶來帶來的操作行的操作行為為也不同,也不同,該參數該參數的可的可選值選值如下:如下:SIG_BLOCKSIG_BLOCK:該值該值代表的功能是代表的功能是將將newsetnewset所指向的信所指向的信號號集中所包含的信集中所包含的信號號加到加到當當前的信前的信號號
21、掩掩碼碼中中作作為為新的信新的信號屏號屏蔽字。蔽字。SIG_UNBLOCKSIG_UNBLOCK:將參數將參數newsetnewset所指向的信所指向的信號號集中的信集中的信號從當號從當前的信前的信號號掩掩碼碼中移除。中移除。SIG_SETMASKSIG_SETMASK:設設置置當當前信前信號號掩掩碼為參數碼為參數newsetnewset所指向的信所指向的信號號集中所包含的信集中所包含的信號號。函數調用成功則返回函數調用成功則返回0 0;出錯則返回;出錯則返回-1-1。注意:注意:sigprocmask()sigprocmask()函數只為單線程定義的,在多線程中要使用函數只為單線程定義的,在
22、多線程中要使用pthread_sigmaskpthread_sigmask變量,在使變量,在使用之前需要聲明和初始化。用之前需要聲明和初始化。sigsuspend()函數sigsuspend()sigsuspend()函函數數主要主要實現實現了等待一了等待一個個信信號號的到的到來來,即,即將當將當前前進進程掛起。程掛起。該該函函數數的定的定義義形式如下:形式如下:#include#includeInt sigsuspend(const sigset_t Int sigsuspend(const sigset_t * *mask);mask);參數參數maskmask是一個是一個sigset_t
23、sigset_t結構體類型的指針,指向一個信號集,結構體類型的指針,指向一個信號集,當函數當函數sigsuspend()sigsuspend()函數被調用時,參數函數被調用時,參數maskmask所指向的信號集中所指向的信號集中的信號被復制給信號掩碼。隨后,進程會被掛起,直到信號被捕的信號被復制給信號掩碼。隨后,進程會被掛起,直到信號被捕捉到,執行信號相應的處理方法返回時,該函數才會返回,此時捉到,執行信號相應的處理方法返回時,該函數才會返回,此時,信號掩碼恢復為函數調用前的值。,信號掩碼恢復為函數調用前的值。sigpending()函數在調用信號屏蔽的相關函數后,被屏蔽的信號對于調用進程是阻
24、塞的,不能發送給調用進程,因此是待定的(pending),而調用sigpending()函數可以取得這些阻塞的信號集。sigpending()函數的定義形式如下:#includeint sigpending(sigset_t *set);參數set為一個sigset_t類型的指針,指向一個信號集。調用sigpending()函數成功時,參數set會取得被懸掛的信號集,返回值為0;如果調用失敗,會返回-1。例11.3 調用信號阻塞函數將SIGINT信號阻塞。(實例位置:光盤TMsl113)程序代碼如下:#include #include #include #include static void
25、 sig_handler(int signo)/*自定義的信號SIGINT處理函數*/ printf(信號SIGINT 被捕捉!n );int main() sigset_t new, old, pend; if (signal(SIGINT, sig_handler) = SIG_ERR)/*注冊一個信號處理函數sig_handler*/ perror(signal); exit(1); if (sigemptyset(&new) 0)/*清空信號集*/ perror(sigemptyset); if (sigaddset(&new, SIGINT) 0)/*向new信號集中添加SIGINT
26、信號*/標題信號處理的安全問題 在多進程通信時,開發人員通常都會考慮到每個進程運行的安全問題,信號作為進程的異步通信方式,在多進程通信時,開發人員通常都會考慮到每個進程運行的安全問題,信號作為進程的異步通信方式,在實際應用中是相當方便的,但是信號的使用存在一定的安全隱患。信號并不僅是在程序出現錯誤時才調用在實際應用中是相當方便的,但是信號的使用存在一定的安全隱患。信號并不僅是在程序出現錯誤時才調用的。有的時候開發人員也會為了實現某些邏輯的需求,而在程序中安裝一個信號,例如,的。有的時候開發人員也會為了實現某些邏輯的需求,而在程序中安裝一個信號,例如,SIGUSR1SIGUSR1(預留信(預留信
27、號)、號)、SIGRTMINSIGRTMIN(未定義)等,信號在執行了相應的處理函數后,剩下的程序還將正常運行,此時,開發(未定義)等,信號在執行了相應的處理函數后,剩下的程序還將正常運行,此時,開發人員容易被產生的信號進入另一個運行順序中,而忽略了該信號處理函數執行時的上下文。人員容易被產生的信號進入另一個運行順序中,而忽略了該信號處理函數執行時的上下文。 由于信號是用來處理異步事件的,也就是說,信號處理函數執行的上下文所實現的功能是不確定的,例由于信號是用來處理異步事件的,也就是說,信號處理函數執行的上下文所實現的功能是不確定的,例如,一個運行中的程序在調用某個庫函數時,可能會被突如其來的信號中斷,庫函數會提前出錯返回,進而如,一個運行中的程序在調用某個庫函數時,可能會被突如其來的信號中斷,庫函數會提前出錯返回,進而轉去執行該信號的處理函數。對于轉去執行該信號的處理函數。對于alarm()alarm(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 超合同價部分補充協議
- 購買電腦銷售合同協議
- 調料供貨商合同協議
- 訓練設備維修合同協議
- 2025年大學物理考試策略試題及答案
- 2025新能源汽車架構設計考核試題及答案
- 2025年大學化學課程內容分布與復習整體思路研究試題及答案
- 浙江省稽陽聯誼學校2025屆高三下學期4月聯考地理試卷答案
- 2025年老年社會工作師職業考試試題及答案
- 員工內訓協議合同協議
- 全國醫師定期考核公共衛生考核試題500題-1
- 上饒城投筆試試題及答案
- 廣東廣州歷年中考語文現代文閱讀真題43篇(截至2024年)
- 產品三觀:打造用戶思維法則
- 小紅書搜索推廣營銷師認證考試題庫(附答案)
- 圍術期護理常規及技術規范
- 船舶修造行業安全風險監控與應急措施
- GB/T 30595-2024建筑保溫用擠塑聚苯板(XPS)系統材料
- 2024高考物理一輪復習第63講光的波動性電磁波(練習)(學生版+解析)
- DB11T 065-2022 電氣防火檢測技術規范
- 智能風控與合規技術在證券領域的應用
評論
0/150
提交評論