一、核心通過讀取未決訊號集來判斷訊號是否應該被處理。訊號遮蔽字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...