作業系統中,訊號的產生可以告訴系統要去執行某個操作。作業系統中有預設的訊號處理函式。我們也可以更改預設的訊號處理函式,由我們自己寫。——訊號捕捉
我們先來看看訊號在核心中是怎樣的:
訊號對於作業系統來說,分為3類:
1.阻塞訊號
2.未決訊號
3.忽略
每個訊號都有兩個標誌位分別為阻塞(block)和未決(pending),還有乙個函式指標表示處理動作。
訊號產生時,核心在程序控制塊中設定該訊號的未決標誌,直到訊號遞達才清楚該標誌。
ps:linux中,常規訊號在遞達之前產生多次只計一次。
我們看看訊號集操作函式:
#include
//初始化set所指向的訊號集,使其中所有訊號集的對應bit清零
int sigemptyset(sigset_t *set);
//初始化set指向的訊號集,該訊號集表示系統支援的所有訊號
int sigfillset(siget_t *set);
//新增某種訊號
int sigaddset(siget_t *set,int signo);
//刪除某種訊號
int sigdelset(siget_t *set,int signo);
//判斷set訊號集有效訊號中是否包含某種訊號,返回值(bool型別)
int sigismember(const siget_t *set,int signo);
//讀取或更改程序的訊號遮蔽字(阻塞訊號集)
int sigprocmask(int how,const sigset_t *set,sigget_t *oset)
//讀取當前程序的未決訊號集,set,輸出型引數
sigpending(sigset_t *set);
函式使用例子:
#include
#include
#include
#include
void printfsigset(sigset_t *set)
else
}puts("");
}int main()
return
0;}
執行結果:
當我們 ctrl + c 時,傳送sigint 2號訊號。但是我們設定為阻塞,未進行處理,所以在未決訊號集中標著1,並沒有遞達。
我們按 ctrl + \ 時,傳送sigquit,由於該訊號並未阻塞,所以程式結束,段錯誤。
由於作業系統中對訊號有預設的處理函式,我們希望產生某個訊號的時候,處理函式由我們自己定義。
函式:
#include
int sigaction(int signo,const
struct sigaction *act,struct sigaction *oact);
struct sigaction ;
act 和 oact指向的是sigaction結構體,signo是指定訊號的編號。
將sa_handler賦值為常數sigign傳給sigaction表示忽略訊號,
賦值為sig_dfl表示指向系統預設函式,
賦值為乙個函式指標表示用自定義函式捕捉訊號,或者說向核心註冊了乙個訊號處理函式。
簡單例子:
#include
#include
#include
void sig_alrm(int signo)
*/}unsigned
int mysleep(unsigned
int nsecs)
int main()
return
0;}
自己定義的sig_alrm() do nothing :
作業系統訊號
在 posix 相容的平台上,sigkill 是傳送給乙個 程序來導致它立即終止的訊號。sigkill 的符號常量 在標頭檔案 signal.h 中定義。因為在不同平台上,訊號數字可能變化,因此符號訊號名被使用,然而在大量主要的系統上,sigkill 是訊號 9。當sigkill 被傳送給乙個程式時...
Linux作業系統 訊號
1 訊號 乙個很短的訊息,可以被傳送到乙個或一組程序,通常是乙個數,以此來標識訊號。2 1 31編碼了常規訊號 不排隊,連續傳送多次,只有乙個有效 32 64編碼了實時訊號 必須排隊,以便接受多個訊號 3 訊號 隨時被傳送給乙個狀態不可預知的程序,傳送給非執行程序必須有核心儲存,直到程序恢復執行。阻...
作業系統 2 作業系統介面
介面是什麼?使用者用很熟悉的東西進入系統 連線兩個東西 訊號轉換 遮蔽細節.第一部分 作業系統介面 首先從命令列和圖形介面來引入我們作業系統介面的介紹 命令列是一段程式,系統初始化完之後便進入這段程式,這個程式是乙個死迴圈,不斷等待著使用者敲入命令。圖形介面是包括畫圖的c程式 c語言邏輯 重要函式 ...