一、訊號的基本概念
為了更加清晰的了解訊號,那麼就拿我們最熟悉的場景切入:
1>使用者輸入命令,在shell下啟動乙個前台程序。
2>使用者按下ctrl-c,這個鍵盤輸入就是乙個硬體中斷。
3>如果cpu當前正在執行這個**,則該程序的使用者空間**暫停執行,cpu從使用者態切換到核心態處理硬體中斷。
4>終端驅動將ctrl-c解釋成乙個sigint訊號,,記在該程序的pcb中(也可以說傳送乙個sigint訊號給該程序)。
5>當某個時刻要從核心態返回到該程序的使用者態之時,首先處理pcb中記錄的訊號,發現有乙個sigint訊號帶處理,而這個訊號的預設動作是終制程序,所以直接終止程序而不在返回使用者空間**執行。
注:1>ctrl-c產生的訊號只能發給前台程序,乙個命令加個&可以放到後台執行,這樣shellbubi等待程序結束就可以 接受新的命令,啟動新的程序。
2>shell可以同時執行乙個前台程序與任意多個後台程序,只是前台程序才能接到像ctrl-c這樣控制鍵產生的訊號/
3>前台程序在執行過程中使用者隨時可能按下ctrl-c而產生乙個訊號,也就是說該程序的使用者空間**執行到任何地方都有可能收到sigint訊號而終止,所以訊號相對於程序的控制來說是非同步的。
二、訊號的檢視
用kill-l 命令可以檢視系統定義的訊號列表:
每個訊號都有乙個編號和乙個巨集定義名稱,這個可以在signal.h中查詢
三、產生訊號的方式
1>使用者在終端按下某些鍵時,終端驅動程式會傳送給前台程序《例如:ctrl-c ; ctrl-z ;ctrl-\》
2>硬體異常產生訊號,這些條件有硬體檢測並通知核心,然後核心向當前程序傳送適當的訊號,例如當前程序執行了除0的指令,cpu的運算單元會產生異常,核心將這個異常解釋為sigfpe訊號傳送給程序。再比如當前程序訪問了非法記憶體位址,mmu會產生異常,核心將這個異常解釋為sigsegv訊號傳送給程序。
3>乙個程序呼叫kill(2)函式可以傳送訊號給另乙個程序。
4>軟體條件產生。
總而言之:訊號的產生可以分為以下三種:(1.通過終端產生訊號;2.呼叫系統函式向程序發訊號;3.由軟體條件產生。)
四、訊號處理常見方式
1>忽略此訊號。
2>執行此訊號的預設處理動作。
3>提供乙個訊號處理函式,要求核心在處理該訊號時切換到使用者態執行這個處理函式,這種方式稱為捕捉乙個訊號。
五、常見訊號
1>sigset_t(訊號集)
sigset_t型別對於每種訊號用乙個bit表示」有效「或」無效「,至於這個型別內部如何儲存這些bit則依賴於系統實現,從使用者的角度是不關心的,使用者只能呼叫以下函式來操作sigset_t變數,而不應該對它的內部資料做任何解釋,比如用printf直接列印sigset_t變數是沒有意義的。
#include
int sigemptyset(sigset_t * set);
int sigfillset(sigset_t * set);
int sigaddset(sigset_t * set,int signo);
int sigdelset(sigset_t* set,int signo);
int sigismember(const sigset_t * set,int signo);
2>sigpending
用法:#include
sigpending(sigset_t *set)
讀取當前程序的未決訊號集,通過set引數傳出。呼叫成功則返回0,出錯則返回-1.
3>pause
#include
int pause(void);
pause函式使呼叫程序掛起直到有訊號遞達。
4>sigaction
#include
int sigaction(int signo,const struct sigaction *act,struct sigaction *oact);
注:相當於signal;
5>sigchld
子程序在終止時會給父程序發sigchlgd訊號,該訊號的預設處理動作是忽略,父程序可以自定義sigchld訊號的處理函式,這樣父程序就只需專心處理自己的工作,不必關係子程序了,子程序結束時通知父程序,父程序在訊號處理函式中呼叫wait清理子程序即可。
六、**的實現
例1:
檢測結果:
例2:
檢測結果:
例3:
檢測結果:
例4:
檢測結果:
知識點總結
1,迴圈中的中斷 continue 跳出此次迴圈,繼續for迴圈 break 跳出當前for迴圈 return 跳出當前方法 2,字串的操作 componentseparatedbystring stringbyreplacingoccurencesofstring withstring iskin...
知識點總結
oncreate onstrat onresume onpause onstop onrestart ondestroy standard 啟動activity都會產生乙個新的activity 預設模式 singletop 啟動activity允許多個,但不允許重疊 singletask 只允許有乙...
知識點總結
function go go 呼叫 go為變數名 setinterval go,1000 1000ms clearinterval 關閉定時器 function abc a,b 2,3 5undefined 未定義 null 空 nan 非數值 string 字串 var a 123 數字型別 va...