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