訊號在核心中的表示:
訊號在傳遞過程中有三個狀態:執行訊號的處理動作稱為訊號遞達(delivery),訊號從產生到遞達之間的狀態稱為訊號未決(pending)。程序也可以選擇阻塞(block)某個訊號,被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達動作。阻塞和忽略是不同的,只要訊號被阻塞就不會遞達,而忽略是在遞達之後可選一種處理動作。訊號在核心中的表示如下圖所示:
圖中block表和pending表由位圖形式儲存訊號狀態,每個訊號只有一bit的未決標誌,非0即1,不記錄該訊號產生了多少次,阻塞標誌也是這樣表示的。因此,未決和阻塞標誌可以用相同的資料型別sigset_t儲,sigset_t稱為訊號集,這個型別可以表示每個訊號的「有效」或「無效」狀態,在阻塞訊號集中「有效」和「無效」的含義是該訊號是否被阻塞,而在未決訊號集中「有效」和「無效」的含義是該訊號是否處於未決狀態。阻塞訊號集也叫做當前程序的訊號遮蔽字(signal mask),這的「遮蔽」應該理解為阻塞而不是忽略。
訊號處理函式:
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所指向的值
int sigpending(sigset_t *set);
//sigpending讀取當前程序的未決訊號集,通過set引數傳出。調⽤用成功則返回0,出錯則返回 -1
驗證pending表,修改pcb的pending表中的乙個bit位,即發訊號,下面這段**中為ctrl+c訊號
訊號遮蔽pending
實際執 行訊號的處理動作稱為訊號遞 達 delivery 實際的處理方式有三種。1 忽略帶訊號 2 預設處理動作 3 自定義處理動作 訊號從產 生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產 生時將保持在未決狀態,直到程序解除對此訊號的阻塞,...
訊號遮蔽pending
實際執行訊號的處理動作稱為訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才 執行遞達的動作。注意 阻塞和忽略是不同的,只要訊號被阻塞就不會遞達,而忽略是在遞達...
訊號遮蔽 pending表
1.訊號在核心中的三種表示 1 訊號遞達 實際執行訊號的處理動作 2 訊號未決 pending 訊號從產生到遞達的狀態,是一種記錄狀態 3 阻塞訊號 block 被阻塞的訊號不會遞達,它在產生時處於未決狀態,直到程序解除對這個訊號的阻塞,才會執行遞達,但不會立即遞達 阻塞與忽略的不同 忽略是在訊號遞...