訊號的阻塞

2021-08-18 12:38:17 字數 2438 閱讀 6666

一. 阻塞訊號

1.訊號的相關概念

(1) 遞達: 實際執行訊號的處理動作稱為訊號的遞達

(2) 未決: 訊號從產生到遞達之間的過程叫做訊號的未決

(3) 阻塞: 程序可以選擇阻塞某個訊號, 被阻塞的訊號產生時將保持在未決狀態, 直到程序解除該訊號的遮蔽, 才執行遞達動作.

(4) 阻塞和忽略的不同: 訊號被阻塞就不會被遞達, 而訊號被忽略是該訊號遞達的一種方式

(5) 訊號遞達的幾種方式: 忽略, 預設處理, 自定義

二. 訊號在核心中的表示

每個訊號都有兩個標誌位表示該訊號的阻塞和未決還有乙個函式指標表示該訊號的處理動作, 訊號產生時,核心在程序控制塊中設定該訊號的未決標識, 直到該訊號遞達才清除該標誌. 在圖上 sigup 訊號未產生過, 也為阻塞過, 當它遞達時執行預設動作, sigint 訊號產生過, 並且處於阻塞狀態, 該訊號暫時不能被遞達, 直到被解除阻塞. sigquit 未產生, 一旦產生, 該訊號就被阻塞, 它的處理動作是自定義. 如果在程序解除對某訊號的阻塞前, 訊號產生過多次, 該訊號該怎樣計算呢? posix.1 允許訊號被遞達一次或者多次, linux 中規定對於普通訊號, 在遞達之前產生多次知己一次, 而對於實時訊號遞達多次可以放在乙個佇列裡.

三. sigset_t

由圖中可以看出, 每個訊號只有乙個 bit 位表示未決, 乙個bit 位表示阻塞, 於是可以用 sigset_t 的資料型別來對兩者進行儲存. sigset_t 它是乙個訊號集, 用來表示該訊號的有效或者無效. 在阻塞表中表示是否阻塞, 在未決表中表示該訊號是否未決.阻塞訊號集也叫做當前訊號的遮蔽字

四. 相關介面函式

1.訊號集相關介面

(1)用於初始化set 所指向的所有訊號集, 將 set 所指向的訊號集中的所有訊號的 bit 全部清零, 表示該訊號集不含任何有效訊號.

(2)sigfillset 用於初始化set訊號集所指向的所有訊號, 將其中所有訊號的 bit 位置位, 該訊號集的有效訊號包括該系統中支援的所有訊號

(3)使用 sigset_t 型別的 變數的時候一定要用 sigsetempty 以及 sigfillset 初始化, 使得訊號集處於確定狀態, 初始化之後就可以呼叫 sigaddset 和 sigdelset 在該訊號集中新增或者刪除 某個訊號

(4) sigismember 用來判斷某個訊號集中是否包含某個訊號, 如果有返回 1, 沒有返回 0, 呼叫失敗返回 -1.

(5)不能對 sigset_t 型別的變數做任何解釋, 如列印等操作, 因為它是系統實現的使用者不必關心

2. 阻塞訊號集相關介面

(1)用來讀取或者更改訊號遮蔽字(阻塞的訊號集), 成功時返回0, 出錯時返回 -1.

(2)how 用來表示更改遮蔽字的方式

(3)oldset 表示原有的阻塞訊號集(訊號遮蔽字), set 表示需要修改的訊號遮蔽字(阻塞訊號集).

how 有三個取值, 假設當前的遮蔽字是mask 則sig_block 相當於 mask = mask | set, sig_unblock 相當於 mask = mask &~set, sig_setmask 相當於 mask = set

3. 未決訊號集相關介面

用於讀取當前程序的未決訊號集, set 是乙個輸出型引數, 有使用者自己設定. 呼叫成功返回0, 呼叫失敗返回 -1.

4. **演示

此時發現當按 ctrl + c 的時候程序不能停止, 因為ctrl + c 是2 號訊號, 該訊號被阻塞, 當產生乙個二號訊號時, 作業系統將其放到未決狀態, 不能被遞達, 因此 ctrl + c 已經能再終止程序, 當按一下 ctrl + \ (3)號訊號,可以終止程序, 因為該程序沒有被阻塞.

訊號的阻塞

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

訊號的阻塞

每個訊號都有兩個標誌位分別表示阻塞block和未決pending 還有乙個函式指標表示處理動作。block與pending是兩個位圖,訊號產生時,核心在該程序控制塊中設定該訊號的未決標誌位,當訊號抵達時,才消除該訊號。posix.1允許遞送系統一次或多次該訊號,linux中,在常規訊號遞達之前產生多...

linux訊號 阻塞訊號

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