作業系統 訊號(2)

2021-08-22 04:59:09 字數 2219 閱讀 7760

作業系統中,訊號的產生可以告訴系統要去執行某個操作。作業系統中有預設的訊號處理函式。我們也可以更改預設的訊號處理函式,由我們自己寫。——訊號捕捉

我們先來看看訊號在核心中是怎樣的:

訊號對於作業系統來說,分為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語言邏輯 重要函式 ...