訊號遮蔽pending

2021-08-03 16:31:34 字數 1773 閱讀 5521

實際執行訊號的處理動作稱為訊號遞達(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 被阻塞的訊號不會遞達,它在產生時處於未決狀態,直到程序解除對這個訊號的阻塞,才會執行遞達,但不會立即遞達 阻塞與忽略的不同 忽略是在訊號遞...