訊號遮蔽pending

2021-08-03 02:58:18 字數 1921 閱讀 7373

實際執⾏行訊號的處理動作稱為訊號遞 達(delivery),實際的處理方式有三種。

1、忽略帶訊號

2、預設處理動作

3、自定義處理動作

訊號從產⽣生到遞達之間的狀態,稱為訊號未決(pending)。

程序可以選擇阻塞 (block )某個訊號。被阻塞的訊號產⽣生時將保持在未決狀態,直到程序解除對此訊號的阻塞, 才 執⾏行遞達的動作。

注意,阻塞和忽略是不同的,只要訊號被阻塞就不會遞達,⽽而忽略是在遞 達之後 可選的⼀一種處理動作。訊號在核心中的表⽰示可以看作是這樣的:

每個訊號都有兩個標誌位分別表⽰示阻塞(block)和未決(pending),還有⼀乙個函式指標表⽰示處理 動作。訊號產⽣生時,核心在程序控制塊中設定該訊號的未決標誌,直到訊號遞達才清除該標 志。

pengding訊號集的資料結構是一張位圖,

block訊號機也是一張位圖

普通訊號時會被丟棄的,它只能記錄一次

實時訊號是可以被記錄下來的

訊號集和訊號量集是不一樣的。

pending表示當前程序的pending訊號量集

block:表示當前程序的訊號遮蔽字

修改pcb的pending表中的乙個bit位->發訊號

訊號集操作函式

int sigemptyset(sigset_t *set);
//清零操作

int sigfillset(sigset_t *set);
 //初始化set所指向的訊號集,使其中所有訊號的對 應bit置位,表⽰示 該訊號集的有效訊號包括系統⽀支援的所有訊號

int sigaddset(sigset_t *set, int signo);
//在該訊號集中新增有效訊號

int sigdelset(sigset_t *set, int signo);
 //在該訊號集中刪除某個有效訊號

int sigismember(const sigset_t *set, int signo); //是⼀乙個布林 函式,⽤用於判斷⼀乙個訊號集的有效訊號中是否包含某種 訊號,若包含則返回1,不包含則返回0, 出錯返回-1。

sigprocmask

調⽤用函式sigprocmask可以讀取或更改程序的訊號遮蔽字(阻塞訊號集)。

#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引數的可選值。

sigpending

#include 

int sigpending(sigset_t *set);

sigpending讀取當前程序的未決訊號集,通過set引數傳出。調⽤用成功則返回0,出錯則返回 -1

訊號遮蔽pending

實際執行訊號的處理動作稱為訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才 執行遞達的動作。注意 阻塞和忽略是不同的,只要訊號被阻塞就不會遞達,而忽略是在遞達...

訊號遮蔽pending

訊號在核心中的表示 訊號在傳遞過程中有三個狀態 執行訊號的處理動作稱為訊號遞達 delivery 訊號從產生到遞達之間的狀態稱為訊號未決 pending 程序也可以選擇阻塞 block 某個訊號,被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達動作。阻塞和忽略是不同的,只要...

訊號遮蔽 pending表

1.訊號在核心中的三種表示 1 訊號遞達 實際執行訊號的處理動作 2 訊號未決 pending 訊號從產生到遞達的狀態,是一種記錄狀態 3 阻塞訊號 block 被阻塞的訊號不會遞達,它在產生時處於未決狀態,直到程序解除對這個訊號的阻塞,才會執行遞達,但不會立即遞達 阻塞與忽略的不同 忽略是在訊號遞...