訊號(六)訊號集操作函式

2021-08-18 14:47:39 字數 1585 閱讀 3264

一、核心通過讀取未決訊號集來判斷訊號是否應該被處理。訊號遮蔽字mask可以影響未決訊號集。為我們可以在應用程式中自定義set來改變mask,來達到遮蔽指定訊號的目的。

二、訊號集設定:

sigset_t set;//typedef unsigned long sigset_t; 

int sigemptyset(sigset_t *set); //將某個訊號集清零

int sigfillset(sigset_t *set); //將某個訊號集置1

int sigaddset(sigset_t *set, int signum); //將某個訊號加入訊號集

int sigdelset(sigset_t *set, int signum); //將某個訊號集清出訊號集

int sigismember(const sigset_t *set, int signum); //判斷某個訊號是否在訊號集中

以上前四個函式執行成功返回0,失敗返回-1。函式返回1時,表示在集合中;返回0時,表示不在集合中。

sigset_t型別其實本質上是點陣圖。但是在linux中我們一般不用位操作去處理,而是使用上面的五個函式來處理。(這麼做是為了保證**跨平台也能有效,型別select函式)

三、sigprocmask函式

1、用來遮蔽訊號、解除遮蔽。本質上是修改程序的訊號遮蔽字(程序的訊號遮蔽字在pcb中)。這裡要注意:遮蔽訊號是將訊號處理遮蔽掉,這樣做只會讓訊號處理延後到遮蔽解除;而忽略訊號(3種訊號處理方式之一)則表示將訊號丟棄掉。

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);  //成功返回0,失敗返回-1
2、引數:

①set:傳入引數,是乙個位圖,set中哪些位置為1,就表示當前程序遮蔽哪些訊號。

②oldset:if  oldset is non-null, the previous value of the signal mask is stored

in oldset。

③how引數:(假設當前訊號遮蔽字為mask)

sig_block:當how取此值時,set表示需要遮蔽的訊號,相當於mask=mask|set

sig_unblock:當how取此值時,set表示需要解除遮蔽的訊號。相當於mask=mask&~set

sig_setmask:當how設定為此,set表示用於替代原來遮蔽集的新遮蔽集。相當於mask=set

3、如果呼叫sigprocmask解除了對當前若干個訊號的阻塞,則在sigprocmask返回前,至少將其中乙個訊號遞達!

四、訊號集設定、sigprocmask函式、未決訊號集、阻塞訊號集的關係圖

五、sigpending函式

讀取當前程序的未決訊號集

int sigpending(sigset_t *set); //成功返回0.失敗返回-1
六、練習:編寫程式,把所有常規訊號的未決狀態列印出來。

通訊架構學習 nginx 六 訊號集相關知識

訊號集 乙個程序必須能夠記住它當前阻塞了哪些訊號 0000001000000000000000 標誌位 我們需要被稱為訊號集的資料型別 能把60多個訊號都表示下。linux中用sigset t結構型別來表示訊號集 64位 typedef structsigset t 訊號集相關函式 a sigemp...

Qt學習六 訊號與槽

訊號和槽是qt的核心特徵。用於物件間的通訊,類似觀察者模式。例如當乙個按鈕被點選,按鈕監測到自己被點選了一下,就會傳送乙個訊號 signal 這個訊號無目的,類似廣播。如果我們需要處理這個訊號,那麼就需要使用connect來連線乙個物件,使用該物件對應的槽函式 slot 來處理這個訊號。也就是說,當...

訊號集函式

訊號集處理函式 清空訊號集 int sigempty sigset t set 填充訊號集 int sigfillset sigset t set 新增某個訊號到訊號集 int sigaddset sigset t set,int signum 從集合中刪除某個訊號 int sigdelset si...