執行訊號的處理動作稱為訊號遞達(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 功能 將訊...