一、不可靠信號
lnux信號機制基本上是從UNIX系統中繼承過來的。早期UNIX系統中的信號機制比較簡單和原始,后來在實踐中暴露一些問題,它的主要問題是:
1. 進程每次處理信號后,就將對信號的響應設置為默認動作,在某些情況下,將導致對信號的錯誤處理;因此,在用戶如果不希望這樣的操作,那么就要在信號處理函數結尾在一次調用signal(),重新安裝該信號。
2. 早期UNIX下的不可靠信號主要指的是進程可能對信號做出錯誤的反應以及信號可能丟失。
3. linux支持不可靠信號,但是對不可靠信號機制做出了改進:在調用完信號處理函數后,不必重新調用該信號的安裝函數(信號安裝函數是在可靠機制上是實現的)。因此,linux下的不可靠信號問題主要指的是信號可能丟失。
?
二、不可靠信號的發展
隨著時間的發展,實踐證明了有必要對信號的原始機制加以改進和擴充。所以,后來出現的各種UNIX版本分別在這方面進行了研究,力圖實現"可靠信號"。由于原來定義的信號已經有許多應用,不好再做改動,最終只好又新增加了一些信號,并在一開始就把它們定義為可靠信號,這些信號支持排隊,不會丟失。
同時,信號的發送和安裝也出現了新版本:發送函數sigqueue()及信號安裝函數sigaction()。
早期UNIX系統只定義了32種信號,Ret hat7.2支持64種信號,編號0-63(SIGRTMIN = 31, SIGRTMAX = 63),將來可能進一步增加,這需要得到內核的支持。前32種信號已經有了預定義值,每個信號有了確定的用途和定義,并且每種信號都有各自缺省動作。如按鍵盤CTRL + C時,會產生SIGINT信號,對該信號的默認反應就是進程終止。后32個信號表示實時信號,等同前面闡述的可靠信號。這保證了發送的多個實時信號都被接收,實時信號是POSIX標準的一部分,可用于應用進程。
非實時信號都不支持排隊,都是不可靠信號;實時信號都支持排隊,都是可靠信號。
?
三、可靠信號術語和語義
執行信號的處理動作稱作為遞達(Delivery),信號從產生到遞達之間的狀態,稱之為信號未決(Pending),進程可以選擇阻塞(Block)某個信號。被阻塞的信號產生時將保持在未決狀態,直到進程解除對信號的阻塞,才執行遞達的動作。注意,阻塞和忽略是不同的,只要信號被阻塞就不會遞達,而忽略信號是在遞達之后可選的一種處理動作。信號在內核中的表示可以看作是這樣的