linux訊號阻塞與未決

2021-08-01 14:31:11 字數 2247 閱讀 1170

執行訊號的處理動作稱為訊號遞達(delivery),訊號從產生到遞達之間的狀態,稱為訊號未決(pending)。

程序可以選擇阻塞(block)某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。

注意,阻塞和忽略是不同,只要訊號被阻塞就不會遞達,而忽略是在遞達之後可選的一種處理動作。

1:pcb程序控制塊中函式有訊號遮蔽狀態字(

block

)訊號未決狀態字(

pending

)還有是否忽略標誌(或是訊號處理函式

);block

狀態字、

pending

狀態字 

64bit

;2:訊號遮蔽狀態字(block),1

代表阻塞、

0代表不阻塞;訊號未決狀態字(

pending)的1

代表未決,

0代表訊號可以抵達了;它們都是每乙個bit代表乙個訊號,比如,

bit0

代表訊號

sighup;

3:比如向程序傳送sigint

,核心首先判斷訊號遮蔽狀態字是否阻塞,如果該訊號被設為為了阻塞的,那麼訊號未決狀態字(pending)相應位製成1

;若該訊號阻塞解除,訊號未決狀態字(pending

)相應位製成

0;表示訊號此時可以抵達了,也就是可以接收該訊號了。

4:遮蔽狀態字使用者可以讀寫,

未決狀態字使用者只能讀;這是訊號設計機制。

訊號集操作函式,對狀態字進行操作(遮蔽狀態字和未決狀態字):

#include int sigemptyset(sigset_t *set);//將訊號集清空,共64bits  

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

int sigaddset(sigset_t *set, int signum);//將signum對應的位置為1

int sigdelset(sigset_t *set, int signum);//將signum對應的位置為0

int sigismember(const sigset_t *set, int signum);//判斷signum是否在該訊號集合中,如果集合中該位為1,則返回1,表示位於在集合中

還有乙個函式可以讀取更改遮蔽狀態字的api函式
#include int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
引數how有下面三種取值:

sig_block:  將引數set指向的訊號集中設定的訊號新增到現在的遮蔽狀態字中,設定為阻塞;

sig_unblock:將引數set指向的訊號集中設定的訊號新增到現在的遮蔽狀態字中,設定為非阻塞, 也就是解除阻塞;

sig_setmask:將引數set指向的訊號集直接覆蓋現在的遮蔽狀態字的值;

如果oset是非空指標,則讀取程序的當前訊號遮蔽字通過oset引數傳出。

若成功則為0,若出錯則為-1

還有乙個函式可以讀取未決狀態字(pending)資訊 

#include int sigpending(sigset_t *set);
例項解析:

剛開始設定sigint訊號為阻塞訊號,當按下ctrl+c傳送中斷訊號sigint(值為2,所以後來第二位被置1)之前,未決狀態字的所有位都是0,因為此時沒有未抵達的訊號;

當傳送sigint訊號後,因為該訊號是阻塞的,所以未決狀態字將第二位置為了1,表示該訊號在這裡阻塞了;當我按下ctrl+\傳送sigquit訊號後,又將sigint訊號設定為了非阻塞的;此時可以看到未決狀態字的所有位都變為了0;並且也收到了剛才阻塞的sigint訊號;

訊號「未決」與「阻塞」

訊號狀態 訊號的 未決 是一種狀態,指的是從訊號的產生到訊號被處理前的這一段時間 訊號的 阻塞 是乙個開關動作,指的是阻止訊號被處理,但不是阻止訊號產生。apue例題在sleep前用sigprocmask阻塞了退出訊號,然後sleep,然後在sleep的過程中產生乙個退出訊號,但是此時退出訊號被阻塞...

訊號「未決」與「阻塞」

訊號狀態 訊號的 未決 是一種狀態,指的是從訊號的產生到訊號被處理前的這一段時間 訊號的 阻塞 是乙個開關動作,指的是阻止訊號被處理,但不是阻止訊號產生。apue例題在sleep前用sigprocmask阻塞了退出訊號,然後sleep,然後在sleep的過程中產生乙個退出訊號,但是此時退出訊號被阻塞...

linux基礎 訊號阻塞及未決訊號

未決訊號 pause的使用 訊號傳送處理過程 可重入函式 訊號處理函式的繼承 setitimer實現定時器 程序可以設定對某個訊號的阻塞 遮蔽 需要用到sigset t 訊號集 資料型別。sigemptyset 3 include int sigemptyset sigset t set 功能 將訊...