五、訊號阻塞和未決訊號
訊號集型別:sigset_t
系統對sigset_t型別進行了封裝
#include
int sigemptyset(sigset_t *set);
功能:初始化訊號集,不包含任何訊號
引數:set:指定要初始化的訊號集
返回值:0 成功
-1 錯誤
int sigfillset(sigset_t *set);
功能:初始化訊號集為滿,包含所有的訊號
引數:set:指定要初始化的訊號集
返回值:0 成功
-1 錯誤
int sigaddset(sigset_t *set, int signum);
功能:新增指定的訊號到訊號集
引數:set:指定訊號集
signum:指定訊號
返回值:0 成功
-1 錯誤
int sigdelset(sigset_t *set, int signum);
功能:從指定的訊號集刪除指定的訊號
引數:set:指定訊號集合
signum:指定訊號
返回值:0 成功
-1 錯誤
int sigismember(const sigset_t *set, int signum);
功能:測試訊號是否為集合的一員
引數:set:指定訊號集合
signum:指定訊號
返回值:-1 錯誤
1 是0 不是
通過sigprocmask(2)設定訊號集為程序的遮蔽字
#include
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
功能:檢測或者改變阻塞訊號
引數:set:新的訊號遮蔽字
how:
sig_block:原來的set和set的並集
sig_unblock:將set集合中的訊號從當前程序的set中移除。
sig_setmask:將set設定為當前程序的訊號遮蔽字
oldset:儲存程序原來的訊號遮蔽字,如果為空不儲存。
返回值; 0 成功
-1 錯誤
舉例:編寫**實現對2號訊號的阻塞(blocked2.c)
#include
#include
#include
void doit()
int main()
while(i++ < 2000000)
sigprocmask(sig_setmask,&oset,null);
return
0; }
多次傳送2號訊號,程序對2號訊號阻塞,在解除阻塞的時候,訊號處理函式只執行一次,造成了訊號的丟失。這樣的訊號稱為不可靠訊號 1~31
從34到64稱為可靠訊號,不會有訊號丟失
檢測程序的未決訊號:
#include
int sigpending(sigset_t *set);
功能:檢測未決訊號
引數:set:未決訊號掩碼
返回值:0 成功
-1 錯誤
舉例:檢測程序的未決訊號集(pending.c)
#include
#include
int main()
while(1)
}return
0; }
訊號「未決」與「阻塞」
訊號狀態 訊號的 未決 是一種狀態,指的是從訊號的產生到訊號被處理前的這一段時間 訊號的 阻塞 是乙個開關動作,指的是阻止訊號被處理,但不是阻止訊號產生。apue例題在sleep前用sigprocmask阻塞了退出訊號,然後sleep,然後在sleep的過程中產生乙個退出訊號,但是此時退出訊號被阻塞...
訊號「未決」與「阻塞」
訊號狀態 訊號的 未決 是一種狀態,指的是從訊號的產生到訊號被處理前的這一段時間 訊號的 阻塞 是乙個開關動作,指的是阻止訊號被處理,但不是阻止訊號產生。apue例題在sleep前用sigprocmask阻塞了退出訊號,然後sleep,然後在sleep的過程中產生乙個退出訊號,但是此時退出訊號被阻塞...
linux訊號阻塞與未決
執行訊號的處理動作稱為訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻塞和忽略是不同,只要訊號被阻塞就不會遞達,而忽略是在遞達之後可...