實際執行訊號的處理動作稱為訊號遞達(delivery),訊號從產生到遞達之間的狀態,稱為訊號未(pending)。程序可以選擇阻塞(block )某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才 執行遞達的動作。
注意:
阻塞和忽略是不同的,只要訊號被阻塞就不會遞達,而忽略是在遞達之後可選的一種處理動作
訊號間三張表的關係(block->pending->handler)
1、鍵盤組合鍵(ctrl+c、ctrl+\、ctrl+z……)
2、軟硬體產生(指標異常,記憶體溢位)
3、kill 訊號(linux下kill -l可對訊號進行檢視)
處理方式,一般有三種:
1.忽略
2.預設動作
3.使用者自定義
訊號阻塞,這pcb中,block所對應的位元位是「1」,表示訊號阻塞,pending未決狀態位可為「1」或者「0」,如果訊號一旦遞達,則進行訊號處理(handler)
訊號集操作函式
sigset_t型別對於每種訊號用⼀乙個bit表示「有效」或「無效」狀態
int sigemptyset(sigset_t *set);//初始化set所指向的訊號集,使其中所有訊號的對應bit清零,表示該訊號集不包含任何有效訊號
int sigfillset(sigset_t *set);//t初始化set所指向的訊號集,使其中所有訊號的對應bit置位有效,表示該訊號集的有效訊號包括系統支援的所有訊號
int sigaddset(sigset_t *set, int signo);//訊號集中新增某種有效訊號
int sigdelset(sigset_t *set, int signo);//訊號集中刪除某種有效訊號 int sigismember(const sigset_t *set, int signo); //用於判斷乙個訊號集的有效訊號中是否包含某種訊號
呼叫函式sigprocmask可以讀取或更改程序的訊號遮蔽字(阻塞訊號集)。
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
返回值:若成功則為0,若出錯則為-1
how引數:
1)sig_block新增到當前訊號遮蔽字的訊號
2)sig_unblock從當前訊號遮蔽字中解除的訊號
3)sig_setmask設定當前訊號遮蔽字為set所指向的值
#include
#include
#include
void printsigset(sigset_t *set)
else
}
puts("");
}int main()
return
0;}
ctrl+c前後
前:
後:
訊號遮蔽pending
實際執 行訊號的處理動作稱為訊號遞 達 delivery 實際的處理方式有三種。1 忽略帶訊號 2 預設處理動作 3 自定義處理動作 訊號從產 生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產 生時將保持在未決狀態,直到程序解除對此訊號的阻塞,...
訊號遮蔽pending
訊號在核心中的表示 訊號在傳遞過程中有三個狀態 執行訊號的處理動作稱為訊號遞達 delivery 訊號從產生到遞達之間的狀態稱為訊號未決 pending 程序也可以選擇阻塞 block 某個訊號,被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達動作。阻塞和忽略是不同的,只要...
訊號遮蔽 pending表
1.訊號在核心中的三種表示 1 訊號遞達 實際執行訊號的處理動作 2 訊號未決 pending 訊號從產生到遞達的狀態,是一種記錄狀態 3 阻塞訊號 block 被阻塞的訊號不會遞達,它在產生時處於未決狀態,直到程序解除對這個訊號的阻塞,才會執行遞達,但不會立即遞達 阻塞與忽略的不同 忽略是在訊號遞...