青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-4  評論-40  文章-117  trackbacks-0


信號與進程是分不開的,而把信號與進程的筆記分開來寫,是因為我覺得這個信號太難搞懂了,特別是APUE信號這一章還把信號結合歷史來介紹弄的我云里霧里。 

信號本質上是在軟件層次上對中斷機制的一種模擬,他有幾種產生方式和處理方式(APUE有介紹),下面帶著疑惑從幾個角度對信號進行介紹 


(一)    站在進程的角度

進程發現和接受信號

我們知道,信號是異步的,一個進程不可能等待信號的到來,也不知道信號會到來,那么,進程是如何發現和接受信號呢?實際上,信號的接收不是由用戶進程來完成的,而是由內核代理。當一個進程P2向另一個進程P1發送信號后,內核接受到信號,并將其放在P1的信號隊列當中。當P1再次陷入內核態時,會檢查信號隊列,并根據相應的信號調取相應的信號處理函數

Task _struct 是進程控制塊(PCB),詳見          http://oss.org.cn/kernel-book/ch04/4.3.htm

 

信號檢測和響應時機

剛才我們說,當P1再次陷入內核時,會檢查信號隊列。那么,P1什么時候會再次陷入內核呢?陷入內核后在什么時機會檢測信號隊列呢?

1.      當前進程由于系統調用、中斷或異常而進入系統空間以后,從系統空間返回到用戶空間的前夕。

2.      當前進程在內核中進入睡眠以后剛被喚醒的時候(必定是在系統調用中),或者由于不可忽略信號的存在而提前返回到用戶空間


進入信號處理函數

 

 


對于sigprocmask 會進入內核空間、pause需要從進入睡眠這兩者都符合檢測處理信號函數的條件,所以存在忽略信號的情況,而APUE講sigsuspend的之后真是晦澀難懂,其實他主要做的工作就是等待一個中斷然后執行相應的handle處理

所以我感覺例子中的

sigsuspend(&zeromask);

sigprocmask(SIG_SETMASK, &oldmask,NULL);

是不是可以直接替換為

Sigsuspend(&oldmask)

因為測試情況難以出現,這里只是個人理解并未得到驗證

 

 

(二)  站在信號自身的角度

 

信號生命周期:

 對于一個完整的信號生命周期(從信號發送到相應的處理函數執行完畢)來說,可以分為三個重要的階段,這三個階段由四個重要事件來刻畫:

1.信號誕生;

2.信號在進程中注冊完畢;

3.信號在進程中的注銷完畢;

4.信號處理函數執行完畢。

相鄰兩個事件的時間間隔構成信號生命周期的一個階段。

 

    詳細描述各個生命周期

1.     信號"誕生"。

信號的誕生指的是觸發信號的事件發生(如檢測到硬件異常、定時器超時以及調用信號發送函數kill()或sigqueue()等)。 

2.      信號在目標進程中"注冊"。

這里注冊定義不是由signal或者sigaction實現的,而是說信號發生之后內核中自動對信號的注冊保存。

進程的task_struct結構中有關于本進程中未決信號的數據成員: 

struct sigpending pending;

struct sigpending

{

    struct sigqueue *head, **tail;

    sigset_t signal;

};

第一、第二個成員分別指向一個sigqueue類型的結構鏈(稱之為"未決信號信息鏈")的首尾,第三個成員是進程中所有未決信號集,信息鏈中的每個sigqueue結構體刻畫一個特定信號所攜帶的信息,并指向下一個sigqueue結構:

struct sigqueue

{

    struct sigqueue *next;

    siginfo_t info;

};

    信號在進程中注冊指的就是信號值加入到進程的未決信號集中(sigpending結構的第二個成員sigset_t signal),并且信號所攜帶的信息被保留到未決信號信息鏈的某個sigqueue結構中。只要信號在進程的未決信號集中,表明進程已經知道這些信號的存在,但還沒來得及處理,或者該信號被進程阻塞。

注: 

    當一個實時信號發送給一個進程時,不管該信號是否已經在進程中注冊,都會被再注冊一次,因此,信號不會丟失,因此,實時信號又叫做"可靠信號"。這意味著同一個實時信號可以在同一個進程的未決信號信息鏈中占有多個sigqueue結構(進程每收到一個實時信號,都會為它分配一個結構來登記該信號信息,并把該結構添加在未決信號鏈尾,即所有誕生的實時信號都會在目標進程中注冊);

當一個非實時信號發送給一個進程時,如果該信號已經在進程中注冊,則該信號將被丟棄,造成信號丟失。因此,非實時信號又叫做"不可靠信號"。這意味著同一個非實時信號在進程的未決信號信息鏈中,至多占有一個sigqueue結構。一個非實時信號誕生后,(1)、如果發現相同的信號已經在目標結構中注冊,則不再注冊,對于進程來說,相當于不知道本次信號發生,信號丟失;(2)、如果進程的未決信號中沒有相同信號,則在進程中注冊自己。在APUE的不可靠信號章節中需要每次重新聲明sinal_hanle函數,這個是說的以前Unix系統的處理,現在可靠不可靠就是上面所說的實時與注冊次數的區別。


3.信號在進程中的注銷。

在目標進程執行過程中,會檢測是否有信號等待處理(每次從系統空間返回到用戶空間時都做這樣的檢查)。(“sigprocmask返回前,也至少會將其中一個未決且未阻塞的信號遞送給進程”)如果存在未決信號等待處理且該信號沒有被進程阻塞,則在運行相應的信號處理函數前,進程會把信號在未決信號鏈中占有的結構卸掉。是否將信號從進程未決信號集中刪除對于實時與非實時信號是不同的。對于非實時信號來說,由于在未決信號信息鏈中最多只占用一個sigqueue結構,因此該結構被釋放后,應該把信號在進程未決信號集中刪除(信號注銷完畢);而對于實時信號來說,可能在未決信號信息鏈中占用多個sigqueue結構,因此應該針對占用gqueue結構的數目區別對待:如果只占用一個sigqueue結構(進程只收到該信號一次),則應該把信號在進程的未決信號集中刪除(信號注銷完畢)。否則,不在進程的未決信號集中刪除該信號(信號注銷完畢)。進程在執行信號相應處理函數之前,首先要把信號在進程中注銷。


4.信號生命終止。

進程注銷信號后,立即執行相應的信號處理函數,執行完畢后,信號的本次發送對進程的影響徹底結束。 


注: 

1)信號注冊與否,與發送信號的函數(如kill()或sigqueue()等)以及信號安裝函數(signal()及sigaction())無關,只與信號值有關(信號值小于SIGRTMIN的信號最多只注冊一次,信號值在SIGRTMIN及SIGRTMAX之間的信號,只要被進程接收到就被注冊)。

2)在信號被注銷到相應的信號處理函數執行完畢這段時間內,如果進程又收到同一信號多次,則對實時信號來說,每一次都會在進程中注冊;而對于非實時信號來說,無論收到多少次信號,都會視為只收到一個信號,只在進程中注冊一次。

 

(三)  進程和信號兩者的角度來看

實際執行信號的處理動作稱為信號遞達(Delivery),信號從產生到遞達之間的狀態,稱為信號未決(Pending)。進程可以選擇阻塞(Block)某個信號。被阻塞的信號產生時將保持在未決狀態,直到進程解除對此信號的阻塞,才執行遞達的動作。注意,阻塞和忽略是不同的,只要信號被阻塞就不會遞達,而忽略是在遞達之后可選的一種處理動作。信號在內核中的表示可以看作是這樣的:

信號在內核中的表示示意圖

 每個信號都有兩個標志位分別表示阻塞和未決,還有一個函數指針表示處理動作。信號產生時,內核在進程控制塊中設置該信號的未決標志,直到信號遞達才清除該標志。在上圖的例子中,

1.      SIGHUP信號未阻塞也未產生過,當它遞達時執行默認處理動作。

2.      SIGINT信號產生過,但正在被阻塞,所以暫時不能遞達。雖然它的處理動作是忽略,但在沒有解除阻塞之前不能忽略這個信號,因為進程仍有機會改變處理動作之后再解除阻塞。

3.      SIGQUIT信號未產生過,一旦產生SIGQUIT信號將被阻塞,它的處理動作是用戶自定義函數sighandler。

 


posted on 2012-02-10 17:49 李陽 閱讀(673) 評論(1)  編輯 收藏 引用 所屬分類: Linux

評論:
# re: Linux 信號 (轉) 2013-05-19 10:18 | cjg
好文,清晰。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            老鸭窝毛片一区二区三区 | 欧美寡妇偷汉性猛交| 午夜精品福利电影| 韩国欧美国产1区| 免费的成人av| 欧美裸体一区二区三区| 亚洲综合电影| 久久久av水蜜桃| 最近中文字幕日韩精品| 一本色道久久88综合亚洲精品ⅰ| 国产精品福利在线观看网址| 久久精品理论片| 麻豆精品在线视频| 亚洲视频一二区| 欧美诱惑福利视频| 日韩亚洲视频| 欧美一区二区在线视频| 亚洲激情电影在线| 亚洲欧美韩国| 91久久午夜| 亚洲欧美日本国产有色| 亚洲片国产一区一级在线观看| 日韩一二三区视频| 激情久久五月天| 一区二区三区免费观看| 一区在线电影| 亚洲影视在线| 日韩天堂在线视频| 久久久999国产| 亚洲综合第一| 欧美韩国日本一区| 六月天综合网| 国产精品视频免费一区| 最近中文字幕mv在线一区二区三区四区 | 欧美激情第4页| 国产裸体写真av一区二区 | 亚洲一区二三| 欧美激情麻豆| 玖玖在线精品| 国产三级欧美三级日产三级99| 亚洲福利在线视频| 国产一区二区三区在线观看精品 | 国产精品永久| 一卡二卡3卡四卡高清精品视频| 国语精品一区| 亚洲欧美日本在线| 亚洲欧美三级在线| 在线综合视频| 亚洲国内精品| 亚洲国产成人av好男人在线观看| 亚洲综合色网站| 亚洲无线观看| 欧美日韩美女| 亚洲精品影院在线观看| 亚洲三级影院| 欧美国产精品中文字幕| 欧美不卡一区| 亚洲欧洲日本专区| 欧美成人免费大片| 欧美大片免费观看| 亚洲片在线观看| 免费h精品视频在线播放| 女同性一区二区三区人了人一| 国产一区二区三区黄视频| 亚洲制服av| 久久精品视频一| 国精产品99永久一区一区| 久久精品二区| 欧美.www| 亚洲精品一区二区三区蜜桃久 | 最新国产成人av网站网址麻豆| 亚洲大黄网站| 欧美激情第三页| 99精品福利视频| 欧美伊人久久久久久久久影院 | 欧美日韩在线电影| 亚洲丝袜av一区| 久久国产精品99国产精| 韩国女主播一区二区三区| 美女国内精品自产拍在线播放| 亚洲国产精品成人精品| 亚洲精品日韩精品| 国产精品久久久久久久浪潮网站| 亚洲欧美国产精品va在线观看| 久久久久一区二区| 亚洲每日更新| 国产精品日韩久久久久| 久久精品二区亚洲w码| 亚洲人在线视频| 欧美专区在线观看| 亚洲高清免费| 国产精品久久久久久福利一牛影视 | 亚洲视频国产视频| 国产一区二区三区久久久| 欧美88av| 亚洲尤物精选| 亚洲第一色在线| 欧美一级二区| 亚洲区一区二| 国产欧美精品在线| 欧美极品在线观看| 欧美永久精品| 99视频在线观看一区三区| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲伦理精品| 一区二区三区在线免费观看| 欧美午夜在线一二页| 久久精品免费| 亚洲欧美日韩精品久久| 亚洲福利视频免费观看| 久久精品一二三区| 亚洲一区黄色| 夜夜嗨av色一区二区不卡| 国产亚洲欧美一区二区三区| 欧美日韩视频在线观看一区二区三区| 国产在线日韩| 国产精品高精视频免费| 老司机精品视频一区二区三区| 亚洲一区二区三区精品在线| 亚洲国产精品高清久久久| 六月天综合网| 久久久国产精品一区二区中文 | 国产精品v亚洲精品v日韩精品 | 亚洲欧美一区二区激情| 日韩一区二区福利| 最近看过的日韩成人| 欧美国产视频一区二区| 久热精品视频在线免费观看 | 中文av字幕一区| 亚洲精品中文字幕在线| 亚洲高清在线| 亚洲高清在线视频| 在线观看日韩专区| 好看的av在线不卡观看| 国产午夜精品麻豆| 国产精品视频自拍| 国产精品久久久久三级| 国产精品久久久久久久一区探花 | 久久精品成人一区二区三区| 亚洲欧美日韩在线不卡| 亚洲欧美网站| 欧美专区在线播放| 久久精品国产v日韩v亚洲 | 夜夜嗨网站十八久久| 亚洲美女91| 宅男66日本亚洲欧美视频| 在线亚洲伦理| 午夜精品一区二区三区在线| 亚洲综合另类| 欧美中在线观看| 久久久亚洲影院你懂的| 免费久久99精品国产| 欧美成人有码| 国产精品豆花视频| 亚洲国产精品久久久久秋霞不卡| 国产视频久久久久| 在线观看欧美精品| 夜夜精品视频| 亚洲欧美色一区| 久久婷婷综合激情| 亚洲激情视频在线| 一区二区日韩伦理片| 欧美亚洲色图校园春色| 久久视频国产精品免费视频在线| 欧美a一区二区| 国产精品免费看| 一区免费观看视频| 日韩视频在线你懂得| 香蕉成人啪国产精品视频综合网| 久久精品色图| 亚洲黄网站黄| 午夜综合激情| 欧美精品电影在线| 国产视频久久久久久久| 亚洲免费观看| 久久成人资源| 亚洲毛片视频| 久久人人爽国产| 欧美亚洲第一页| 在线观看国产精品网站| 亚洲天堂成人在线视频| 玖玖玖国产精品| 亚洲一区影音先锋| 免费毛片一区二区三区久久久| 国产精品入口| 亚洲精品午夜精品| 久久综合一区二区三区| 一本色道久久88综合日韩精品| 久久免费精品日本久久中文字幕| 欧美亚一区二区| 久久精品亚洲乱码伦伦中文| 亚洲人成在线观看| 蜜臀av在线播放一区二区三区| 亚洲高清一区二区三区| 亚洲摸下面视频| 国产字幕视频一区二区| 欧美黄色日本| 美女性感视频久久久| 亚洲欧美日韩爽爽影院| 亚洲伦理中文字幕|