做網(wǎng)站的分辨率/祁陽seo
文章目錄
- 八、進程信號
- 2. 信號的保存
- 3. 信號的處理
- 未完待續(xù)
八、進程信號
2. 信號的保存
實際執(zhí)行信號的處理動作稱為信號遞達(Delivery)
信號從產(chǎn)生到遞達之間的狀態(tài),稱為信號未決(Pending)。
進程可以選擇阻塞 (Block )某個信號。
被阻塞的信號產(chǎn)生時將保持在未決狀態(tài),直到進程解除對此信號的阻塞,才執(zhí)行遞達的動作。
注意,阻塞和忽略是不同的,只要信號被阻塞就不會遞達,而忽略是在遞達之后可選的一種處理動作。
在進程的PCB中,有兩個位圖,一個是判斷是否收到相應(yīng)信號的位圖pending,一個是決定該位置的信號是否阻塞的位圖block。
handler表是一組函數(shù)指針,決定信號的執(zhí)行方法。
調(diào)用函數(shù) sigprocmask 可以讀取或更改進程的信號屏蔽字(阻塞信號集)。
int main()
{// 創(chuàng)建阻塞信號集sigset_t block, oblock;// 清空信號集sigemptyset(&block);sigemptyset(&oblock);// 將2號信號添加進阻塞信號集sigaddset(&block, 2);// 將阻塞信號集設(shè)置到內(nèi)核中int n = sigprocmask(SIG_SETMASK, &block, &oblock);assert(n == 0);while (true){// 創(chuàng)建pending信號集sigset_t pending;sigemptyset(&pending);// 獲取pending信號集n = sigpending(&pending);assert(n == 0);// 打印pending信號集PrintSig(pending);sleep(1);}return 0;
}
9號信號、19號信號無法被屏蔽,18號信號會做特殊處理。操作系統(tǒng)不允許出現(xiàn) 金剛不壞 的進程。
如何解除屏蔽?
while (true){int cnt = 0;// 創(chuàng)建pending信號集sigset_t pending;sigemptyset(&pending);// 獲取pending信號集n = sigpending(&pending);assert(n == 0);// 打印pending信號集PrintSig(pending);++cnt;if (cnt == 20){// 解除阻塞信號集n = sigprocmask(SIG_UNBLOCK, &block, &oblock);assert(n == 0);}sleep(1);}