訊號的阻塞

2021-08-31 18:29:47 字數 2029 閱讀 9678

每個訊號都有兩個標誌位分別表示阻塞block和未決pending

,還有乙個函式指標表示處理動作。(block與pending是兩個位圖,)

訊號產生時,核心在該程序控制塊中設定該訊號的未決標誌位,當訊號抵達時,才消除該訊號。

posix.1允許遞送系統一次或多次該訊號,linux中,在常規訊號遞達之前產生多次只記一次,而實時訊號產生多次,可依此放在乙個佇列中。

sigset_t 訊號集

(pending 和 block 禁止使用位操作,只能使用系統呼叫)

每個訊號的阻塞和未決標誌位只有乙個位元位,不論產生了幾次訊號都只記一次

未決和阻塞標誌都可以用sigset_t來儲存。

sigset_t 可以表示每個訊號的有效和無效態

在阻塞訊號集中:有效無效表示該訊號是否被阻塞

在未決訊號集中:有效無效表示該訊號是否未決

阻塞訊號集也叫做當前程序的訊號遮蔽字(signal mask)

,這裡的遮蔽應該理解為阻塞而不是忽略。

sigset_t 儲存pending 叫做pending訊號集

訊號操作集函式

sigset_t 對每種訊號用乙個bit位來表示有效或無效的狀態,該型別對於bit位的實現依賴於系統實現。

我們只能用系統呼叫來操作sigset_t變數,而不應對它的內部資料做任何解釋,比如用printf 列印sigset_t是沒有任何意義的。

#include int sigemptyset(sigset_t *set)

//初始化set所指向的訊號集,使其中所有訊號對應的bit位清零,表示該訊號集包含任何有效訊號

int sigfillset(sigset_t *set)

//初始化set所指向的的訊號集,使其中所有訊號對應的bit位置位,表示該訊號集包含系統所支援的所有訊號

int sigaddset(sigset_t *set,int signo)

//將對應訊號對應bit位置位

int sigdelset(sigset_t *set,int signo)

//刪除對應訊號位

int sigismember(const sigset_t *set,int signo)

//為乙個bool函式,用於判斷乙個訊號集中的有效訊號是否包含某種訊號

若包含返回1 不包含返回0 失敗返回-1

在使用sigset_t型別的變數之前,一定要呼叫sigemptyset或sigfillset初始化

初始化sigset_t變數後,就可以使用sigaddset和sigdelset在該訊號中新增或刪除對應訊號

#include int sigprocmask(int how,const sigset_t *set,sigset_t *oset)

//讀取或更改程序的訊號遮蔽字

//成功返回0 失敗返回-1

oset是非空指標:讀取程序的訊號遮蔽字,通過oset傳出

set是非空指標:更改程序的訊號遮蔽字,引數how指示如何更改。

oset和set都是非空指標:先將原來的訊號遮蔽字備份到oset,然後再根據set和how引數更改訊號遮蔽字。

使用mask代表當前訊號遮蔽字

how引數的選項

sig_block

set包含了我們希望新增到當前訊號遮蔽字的訊號 mask=mask

sig_unblock

set包含了我們希望從當前訊號遮蔽字中解除阻塞的訊號 mask=mask&~set

sig_setmask

設定當前訊號遮蔽字為set所指向的值 相當於 mask=set

如果呼叫sigprocmask解除了對當前若干個未決訊號的阻塞,則在sigprocmask返回時至少將其中乙個訊號遞達。

#include sigpending(sigset_t *set)

//讀取當前程序的未決訊號集,通過set引數傳出。

呼叫成功則返回0,出錯則返回-1

訊號的阻塞

訊號的阻塞就是讓系統暫時保留訊號留待以後傳送。注意 不是不傳送,而是延遲傳送 一般情況下訊號的阻塞只是暫時的,只是為了防止訊號打斷敏感的操作。1 訊號集 所有的訊號阻塞函式都使用稱作訊號集的資料結構來表明受到影響的訊號。每乙個操作都包括兩個階段 建立訊號集,傳遞訊號集給特定的庫函式。下面說明訊號集和...

訊號的阻塞

一.阻塞訊號 1.訊號的相關概念 1 遞達 實際執行訊號的處理動作稱為訊號的遞達 2 未決 訊號從產生到遞達之間的過程叫做訊號的未決 3 阻塞 程序可以選擇阻塞某個訊號,被阻塞的訊號產生時將保持在未決狀態,直到程序解除該訊號的遮蔽,才執行遞達動作.4 阻塞和忽略的不同 訊號被阻塞就不會被遞達,而訊號...

linux訊號 阻塞訊號

1.訊號在核心中的表示 我們知道了訊號產生的各種原因,而實際執行訊號處理的動作,叫做訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻...