在學習訊號之前,我們先要知道,訊號與訊號量不是同乙個東西。訊號量主要是實現程序之間的同步與互斥,主要用於程序間通訊。
這就是乙個訊號,現實生活中訊號也特別常見。
訊號的作用
我們先想一下在現實生活中訊號主要是通知一件事情的,其實在作業系統中,訊號也扮演著這樣的角色。
在作業系統中,通知乙個程序發生某乙個事件,打斷當前程序的操作,去處理這個事件。軟體中斷
檢視訊號
程序在相應訊號之前必須先知道該訊號是什麼意思。
上面共62中訊號,其中沒有32,33訊號。
1-31號訊號:訊號有其對應的事件,非可靠訊號。
34-64號訊號:沒有對應的事件,可靠訊號。
可靠訊號與不可靠訊號最主要的區別就是可靠訊號不會丟失事件,不可靠訊號會丟失事件。
訊號的產生
訊號在程序中的註冊
讓程序知道自己收到了乙個訊號,程序就是乙個pcb,linux下在pcb結構體中定義了乙個訊號的集合set(位圖),若給程序傳送乙個訊號,則將這個訊號對應的位置的二進位制位置1。
位圖只能標記程序是否收到這個訊號,無法確定訊號收到多少次,所以在核心中其實還有乙個鍊錶。
sigset_t set;
申請乙個set集合
sigemptyset(&set);
清空乙個set集合,因為set集合為棧上申請的空間,所以會存在資料
int sigfillset(sigset_t *set);
將所有訊號新增到set中
int sigaddset(sigset_t *set,int signum);
將訊號值為signum新增到set中
訊號在程序中的登出
訊號的處理
程序在收到訊號之後,針對這個訊號的事件找到它對應的處理函式。
訊號處理方式的修改
自定義訊號的捕捉流程
訊號的處理:當前程序從使用者態切換到核心態之前進行處理。
程式從使用者態切換到核心態的方法:中斷,異常,系統呼叫。
訊號的阻塞
在程序中標記,哪個訊號註冊之後,暫時不去處理,知道訊號接觸阻塞。
阻塞乙個訊號被抵達,程序pcb中有乙個訊號block集合,使用者可以在這個集合中標記哪些訊號被阻塞。
本質:將訊號新增到block集合中,則表示這個訊號被阻塞,當訊號傳遞過來時,暫時不處理。
int sigprocmask(int how,const sigset_t *set,sigset_t *oldset
how:即將要對pcb中block集合所作的操作,有三個選項:
注意:1:訊號阻塞時依舊能夠進行訊號註冊,但是暫時不處理。
2:可靠訊號註冊多次,因此會阻塞處理多次,不可靠訊號只能被註冊一次,只阻塞處理一次。
3:9號訊號與19號訊號不能被阻塞。
#include
#include
#include
void
sigcb
(int signo)
intmain()
Linux下訊號的簡單使用
1,1個main,包含2個while,不要被兩個while中的sleep所迷惑,這裡只有main 這乙個主線程 程序 在執行,程式會按照自上而下順序執行。遇到第1個while迴圈中的sleep時,本執行緒暫停執行,交給其它執行緒處理,但是因為該程序只有乙個執行緒,所以只有靜靜的sleep到指定時間 ...
linux 各種訊號及其含義
名稱 預設動作 說明 sighup 終止程序 終端線路結束通話 sigint 終止程序 中斷程序 sigquit 建立core檔案 終止程序,並且生成core檔案 sigill 建立core檔案 非法指令 sigtrap 建立core檔案 跟蹤自陷 sigbus 建立core檔案 匯流排錯誤 sig...
Linux訊號捕捉及其處理
一 signal訊號處理機制 可以用函式signal註冊乙個訊號捕捉函式,其函式原型為 include typedef void sighandler t int sighandler t signal int signum,sighandler t handler 下面用乙個例子來介紹signal...