C語言 unix c 訊號阻塞和未決訊號

2021-08-07 19:30:00 字數 1757 閱讀 1617

五、訊號阻塞和未決訊號

訊號集型別: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 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻塞和忽略是不同,只要訊號被阻塞就不會遞達,而忽略是在遞達之後可...