linux訊號集與訊號遮蔽字

2021-08-08 16:49:59 字數 1933 閱讀 2181

訊號傳遞過程

一些名詞

需要注意的是:這些變數之間也存在一些關係,比如:程序將訊號遮蔽字的2號為置為1,也就是說遮蔽sigint訊號,那麼但你向程序傳送該訊號時(ctrl+c),該訊號必然處於未決狀態。那麼,訊號未決狀態字的2號位自然也就是1啦。

訊號集操作函式

posix.1 定義了乙個資料型別sigset_t,用於表示訊號集。另外,標頭檔案 signal.h 提供了下列五個處理訊號集的函式

這些函式的具體運用會在下面的**中

sigprocmask && 設定程序的訊號遮蔽字

how說明

sig_block

該程序新的訊號遮蔽字是其當前訊號遮蔽字和 set 指向訊號集的並集。set 包含了我們希望阻塞的訊號。

sig_unblock

該程序的訊號遮蔽字是當前訊號遮蔽字和 set 所指向訊號集補給的交集。set 包含了我們希望解除阻塞的訊號。

sig_setmask

設定當前訊號遮蔽字設定為 set 所指向的訊號集。

上面的東西是不是不是很懂,那麼我們通俗點講

how說明

sig_block

把set訊號集裡面的訊號全部設定為阻塞

sig_unblock

把set訊號集裡面的訊號全部解除阻塞

sig_setmask

把set訊號集裡面的訊號全部設定為阻塞或者解除阻塞(當前訊號遮蔽字可能是阻塞,,也可能是接觸阻塞)

#include 

#include

#include

#include

#include

#include

#include

#include

#include

void handler()

int main()

sigprocmask(sig_unblock, &bset, null);//解鎖阻塞

pause();

return

0;}

編譯執行此函式,按一下步驟輸入:

程式執行到getchar(), 輸入ctrl+c,此時並未看見執行訊號處理函式

輸入'q',退出迴圈,再按ctrl+c,看見控制端列印sig_int respond

sigpending 獲取程序未決的訊號集

通俗地將,就是:一旦呼叫sigpending函式,那麼set訊號集中,處於未決狀態的訊號對應的位,被置為1

#include 

#include

#include

#include

#include

#include

#include

#include

#include

void printsigset(sigset_t *set)

printf("\n");

}int main()

pause();

return

0;}

程式開始執行:列印000000000000......

輸入ctrl+c,因為sig_int被阻塞,所以該訊號處於未決狀態

故輸出01000000000000000......

需要注意的是:如果在訊號處理函式中對某個訊號進行解除阻塞時,則只是將pending位清0,讓此訊號遞達一次(同個實時訊號產生多次進行排隊都會抵達),但不會將block位清0,即再次產生此訊號時還是會被阻塞,處於未決狀態。

設定訊號集和訊號遮蔽字

訊號遮蔽字是指乙個程序中當前阻塞而不能夠遞送給該程序的訊號集。訊號集則是乙個能表示多個訊號的集合的一種資料型別,為sigset t。include 下列四個函式成功返回0,出錯返回 1 int sigemptyset sigset t set int sigfillset sigset t set ...

訊號遮蔽字

訊號遮蔽字是指乙個程序中當前阻塞而不能夠遞送給該程序的訊號集。訊號集則是乙個能表示多個訊號的集合的一種資料型別,為sigset t。與訊號集設定相關的函式有如下幾個 cpp view plain copy font size 18px include 下列四個函式成功返回0,出錯返回 1 int s...

linux 訊號遮蔽

include include include include include include sigemptyset newmask 獲取空遮蔽訊號集 sigfillset newmask 獲取遮蔽了所有訊號的遮蔽訊號集,除了那兩個sigkill sigstop sigpending pendma...