Linux 阻塞訊號

2021-07-14 15:52:50 字數 1142 閱讀 3628

linux中訊號產生的原因大致有一下三種:

鍵盤中斷

命令發出

異常產生中斷

但歸根結底,這些訊號其實都是最終有作業系統發出的。

常見的對訊號的處理,無外乎以下三種:

忽略終止該程序

自定義行為

對訊號的處理動作叫做訊號遞達,在訊號由產生到遞達的過程中還有一種狀態叫做未決。即訊號雖產生,但是未被處理。這個時候就需要將訊號儲存起來。

訊號的種類:

其中,前31個訊號屬於普通訊號,後31個屬於實時訊號,這裡不討論實時訊號。

普通訊號有31個,足以用乙個4位元組的變數來儲存。於是就有了block(阻塞)表和pending(未決)表。

其中task_struct,就是linux中的pcb的名稱。在pcb中維護了三張表,分別是block,pending, handler表,block表示哪乙個訊號被阻塞,它的下標的值加1代表對應被阻塞的訊號。pending表表示哪個訊號處於未決狀態,表示方法同block,橫向看過去handler,分別代表捕獲到該訊號時的處理方式。

下面利用一小段程式來測試列印一下pending表:

#include #include #include void printsigset(sigset_t *set)

else

}puts("");

}int main()

return 0;

}

初始時輸出如下:

現在有乙個訊號1處於未決狀態,當按下鍵盤上的ctrlc時,將會產生乙個2訊號給該程序,對應的位會被置1:

知道解除阻塞,這個訊號才會在恰當的時候被處理。

linux訊號 阻塞訊號

1.訊號在核心中的表示 我們知道了訊號產生的各種原因,而實際執行訊號處理的動作,叫做訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻...

Linux入門 訊號(二) 阻塞訊號

實際執行訊號的處理動作稱為訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序接觸對此訊號的阻塞,才執行遞達的操作。阻塞和忽略不同,只有訊號阻塞就不會遞達,而忽略是在訊號遞達之後可選...

Linux下的訊號(二) 阻塞訊號

1,在此之前,必須先了解幾個概念 訊號遞達 delivery 實際執行訊號處理的動作。訊號未決 pending 訊號從產生到遞達之間的狀態。訊號阻塞 block 被阻塞的訊號產生時將保持在未決狀態,直到 程序解除對此訊號的阻塞,才 執行遞達的動作。注意 訊號阻塞和訊號忽略是不同的。只要訊號被阻塞就不...