• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

            信號可靠、不可靠的原因 (轉)

            Posted on 2013-01-05 11:45 鑫龍 閱讀(317) 評論(0)  編輯 收藏 引用 所屬分類: linux編程

            原文地址:http://blogold.chinaunix.net/u1/48788/showart.php?id=2270724


            早期的信號,也就是前32位的信號,在處理信號時,不具備阻塞該信號的能力(也就是不支持排隊),只能忽略,這時候就可能丟失信號。
            使用不可靠信號時注意:
            1) 不要在中斷函數中執行過于復雜的處理流程;
            2) 在信號處理過程返回前,進程會對相同信號的標志進行屏蔽;
            3) 父進程會把當前的信號屏蔽標志位信息傳遞給它派生的子進程。
             
             
             

            信號本質

            信號是在軟件層次上對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一個中斷請求可以說是一樣的。信號是異步的,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知道信號到底什么時候到達。

            信號是進程間通信機制中唯一的異步通信機制,可以看作是異步通知,通知接收信號的進程有哪些事情發生了。信號機制經過POSIX實時擴展后,功能更加強大,除了基本通知功能外,還可以傳遞附加信息。

            信號來源

            信號事件的發生有兩個來源:硬件來源(比如我們按下了鍵盤或者其它硬件故障);軟件來源,最常用發送信號的系統函數是kill, raise, alarm和setitimer以及sigqueue函數,軟件來源還包括一些非法運算等操作。

            二、信號的種類

            可以從兩個不同的分類角度對信號進行分類:(1)可靠性方面:可靠信號與不可靠信號;(2)與時間的關系上:實時信號與非實時信號。在《Linux環境進程間通信(一):管道及有名管道》的附1中列出了系統所支持的所有信號。

            1、可靠信號與不可靠信號

            "不可靠信號"

            Linux信號機制基本上是從Unix系統中繼承過來的。早期Unix系統中的信號機制比較簡單和原始,后來在實踐中暴露出一些問題,因此,把那些建立在早期機制上的信號叫做"不可靠信號",信號值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信號都是不可靠信號。這就是"不可靠信號"的來源。它的主要問題是:

            • 進程每次處理信號后,就將對信號的響應設置為默認動作。在某些情況下,將導致對信號的錯誤處理;因此,用戶如果不希望這樣的操作,那么就要在信號處理函數結尾再一次調用signal(),重新安裝該信號。
            • 信號可能丟失,后面將對此詳細闡述。
              因此,早期unix下的不可靠信號主要指的是進程可能對信號做出錯誤的反應以及信號可能丟失。

            Linux支持不可靠信號,但是對不可靠信號機制做了改進:在調用完信號處理函數后,不必重新調用該信號的安裝函數(信號安裝函數是在可靠機制上的實現)。因此,Linux下的不可靠信號問題主要指的是信號可能丟失。

            "可靠信號"

            隨著時間的發展,實踐證明了有必要對信號的原始機制加以改進和擴充。所以,后來出現的各種Unix版本分別在這方面進行了研究,力圖實現"可靠信號"。由于原來定義的信號已有許多應用,不好再做改動,最終只好又新增加了一些信號,并在一開始就把它們定義為可靠信號,這些信號支持排隊,不會丟失。同時,信號的發送和安裝也出現了新版本:信號發送函數sigqueue()及信號安裝函數sigaction()。POSIX.4對可靠信號機制做了標準化。但是,POSIX只對可靠信號機制應具有的功能以及信號機制的對外接口做了標準化,對信號機制的實現沒有作具體的規定。

            信號值位于SIGRTMIN和SIGRTMAX之間的信號都是可靠信號,可靠信號克服了信號可能丟失的問題。Linux在支持新版本的信號安裝函數sigation()以及信號發送函數sigqueue()的同時,仍然支持早期的signal()信號安裝函數,支持信號發送函數kill()。

            注:不要有這樣的誤解:由sigqueue()發送、sigaction安裝的信號就是可靠的。事實上,可靠信號是指后來添加的新信號(信號值位于SIGRTMIN及SIGRTMAX之間);不可靠信號是信號值小于SIGRTMIN的信號。信號的可靠與不可靠只與信號值有關,與信號的發送及安裝函數無關。目前linux中的signal()是通過sigation()函數實現的,因此,即使通過signal()安裝的信號,在信號處理函數的結尾也不必再調用一次信號安裝函數。同時,由signal()安裝的實時信號支持排隊,同樣不會丟失。

            對于目前linux的兩個信號安裝函數:signal()及sigaction()來說,它們都不能把SIGRTMIN以前的信號變成可靠信號(都不支持排隊,仍有可能丟失,仍然是不可靠信號),而且對SIGRTMIN以后的信號都支持排隊。這兩個函數的最大區別在于,經過sigaction安裝的信號都能傳遞信息給信號處理函數(對所有信號這一點都成立),而經過signal安裝的信號卻不能向信號處理函數傳遞信息。對于信號發送函數來說也是一樣的。

            2、實時信號與非實時信號

            早期Unix系統只定義了32種信號,Ret hat7.2支持64種信號,編號0-63(SIGRTMIN=31,SIGRTMAX=63),將來可能進一步增加,這需要得到內核的支持。前32種信號已經有了預定義值,每個信號有了確定的用途及含義,并且每種信號都有各自的缺省動作。如按鍵盤的CTRL ^C時,會產生SIGINT信號,對該信號的默認反應就是進程終止。后32個信號表示實時信號,等同于前面闡述的可靠信號。這保證了發送的多個實時信號都被接收。實時信號是POSIX標準的一部分,可用于應用進程。

            非實時信號都不支持排隊,都是不可靠信號;實時信號都支持排隊,都是可靠信號。

            久久人人爽人人爽人人AV| 国内精品久久久久影院一蜜桃| 狠狠色丁香久久综合五月| 国产一区二区三区久久精品| 日韩精品久久久久久| 性做久久久久久久久浪潮| 亚洲va中文字幕无码久久| 欧美久久综合性欧美| 亚洲国产成人久久综合区| 色诱久久久久综合网ywww| 狠狠人妻久久久久久综合蜜桃| 久久久国产99久久国产一| 97久久精品人人澡人人爽 | 久久精品无码专区免费东京热| 久久线看观看精品香蕉国产| 亚洲欧美一级久久精品| 久久久精品免费国产四虎| 免费无码国产欧美久久18| 久久亚洲国产欧洲精品一| 精品久久久久久国产| 99久久夜色精品国产网站| 欧洲精品久久久av无码电影| 久久免费国产精品| 一本大道久久a久久精品综合| 一本一本久久a久久综合精品蜜桃| 国产综合免费精品久久久| 97久久精品人人做人人爽| 色综合久久88色综合天天| avtt天堂网久久精品| 色偷偷偷久久伊人大杳蕉| 99久久国产综合精品女同图片| 性做久久久久久免费观看| 国产AⅤ精品一区二区三区久久| 国产A级毛片久久久精品毛片| 亚洲精品高清一二区久久| 色综合合久久天天给综看| 亚洲精品97久久中文字幕无码| 国内精品久久久久久久亚洲| 国产精品久久久久乳精品爆| 久久国产美女免费观看精品| 午夜精品久久久内射近拍高清|