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