訊號遮蔽 pending表

2021-08-03 08:27:28 字數 1647 閱讀 7438

1.訊號在核心中的三種表示

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

(2)訊號未決(pending):訊號從產生到遞達的狀態,是一種記錄狀態;

(3)阻塞訊號(block):被阻塞的訊號不會遞達,它在產生時處於未決狀態,直到程序解除對這個訊號的阻塞,才會執行遞達,但不會立即遞達;

阻塞與忽略的不同:忽略是在訊號遞達後的處理動作,而被阻塞的訊號是不會遞達的;

2.訊號在核心中的表示示意圖:

(1).每個pcb都包含三張表:block,pending,handler,block表和pending表的0(未遞達),1表示是否收到訊號,block表的0(未阻塞),1表示是否被阻塞;

(2).每個訊號都有阻塞標誌位block,末決標誌位pending和乙個處理動作handler;

(3).訊號產生時,核心在pcb中設定末決標誌位,當訊號遞達時才清除該標誌位;

上述圖中:

1.1號訊號未阻塞也未遞達;

2.2號訊號被阻塞,暫時不會遞達;

3.3號訊號未產生過,一旦產生將被阻塞;

3.訊號集(sigset_t)

末決標誌和阻塞標誌可以通過相同的資料型別sigset_t儲存,叫做訊號集;

阻塞訊號集也可以叫做訊號遮蔽字;

4.訊號遮蔽

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

注意:在使用sigset_t型別的變數之前,一定要呼叫sigemptyset或sigfillset做初始化。這四個函式都是成功返回0,出錯返回-1.

#include

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set,int signo);

int sigdelset(sigset_t *set,int signo);

int sigismember(const sigset_t *set,int signo);

1).sigprocmask可以讀取或更改程序的訊號遮蔽字(阻塞訊號集)

#include

int sigprocmask(int how,const sigset_t *set,sigset_t *oset);

返回值:若成功則為0,若出錯則為-1

2).sigpending

#include

int sigpending(sigset_t *set);

sigpending讀取當前程序的末決訊號集,通過set引數傳出。呼叫成功返回0,出粗返回-1

下面用函式做實驗,程式如下:

執行結果為:

訊號遮蔽pending

實際執 行訊號的處理動作稱為訊號遞 達 delivery 實際的處理方式有三種。1 忽略帶訊號 2 預設處理動作 3 自定義處理動作 訊號從產 生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產 生時將保持在未決狀態,直到程序解除對此訊號的阻塞,...

訊號遮蔽pending

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

訊號遮蔽pending

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