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

Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

路漫漫,長修遠,我們不能沒有錢
隨筆 - 173, 文章 - 0, 評論 - 257, 引用 - 0
數據加載中……

防止信號處理失靈(轉載)

?  防止信號處理失靈
  
   作者:Danny Kalev
   編譯:MTT 工作室
  
   原文出處:Preventing Glitches in Signal Processing
  
  
   摘要:本文將剖析 ANSI <signal.h>庫并示范如何使用其接口。進而討論
   POSIX 信號處理 API。
  
  
   信號處理類似硬件中斷。它們促使某個進程從當前的執行控制流程中跳出,以實現特定的行為,待特定處理完成后,再恢復到中斷點繼續執行。本文將剖析
   ANSI <signal.h>庫并示范如何使用其接口。然后,本文將進而討論
   POSIX 信號處理 API。默認情況下,某些信號導致進程終止。例如,試圖存取進程不擁有的內存將觸發 SIGSEGV
   (“段故障”)信號,這時該信號會終止進程的執行。許多應用程序都有這個問題,這是我們不希望看到的。調試,仿真和事務處理系統必須處理這樣的信號以便讓進程繼續執行。那么我們如何防止這種發生呢?
   答案是安裝一個處理器處理進來的信號并在發生時捕獲它們
  
   第一步:建立信號處理器
  
   信號是內核傳給某個進程的一個整數。當進程接收到信號,它便以以下方式之一響應:
   忽略該信號;
   讓內核完成與該信號關聯的默認操作;
   捕獲該信號,即讓內核將控制傳給信號處理例程,等信號處理例程執行完畢,然后又從中斷的地方恢復程序的執行。
  
  
   所謂信號處理例程是一個函數,當某個信號發生時,內核會自動調用該函數。signal()函數為給定的信號注冊一個處理例程:typedef void (*handler)(void);
  void * signal(int signum, handler);
   第一個參數是信號編碼。第二個參數用戶定義的函數地址,當信號 signum 產生時,handler 所指向的函數被調用。
   除了函數地址之外,第二個參數也可以是兩個特殊的值:SIG_IGN 和 SIG_DFL。SIG_IGN 表示該信號應被忽略(注意:SIGKILL
   和 SIGSTOP 在無論如何都是不能被阻塞、捕獲或忽略的);SIG_DFL 指示內核該信號產生時完成默認行為。
  
   第二步:發信號
  
   向某個進程發信號有三種方式:
   進程通過條用 raise() 顯式地發送信號給自己;
   信號從另一個進程發送,比方說通過
   kill() 系統調用或者
   Perl 腳本;
   信號從內核發送。例如,當進程試圖存取不屬于自己的內存,或在系統關閉期間存取內存時;
  
   第三步:產生和處理信號
  
   下面程序注冊 SIGTERM 處理器。然后產生一個 SIGTERM 信號,從而導致該處理器運行:
   #include <csignal>
  #include <iostream>
  using namespace std;
  void term(int sig)
  {
  ? //..necessary cleanup operations before terminating
  ? cout << "handling signal no." <<sig <<endl;
  }
  int main()
  {
   signal(SIGTERM, term); // register a SIGTERM handler
   raise(SIGTERM); // will cause term() to run
  }
   ANSI <signal.h> 的局限
   當進入就緒狀態的某個進程準備運行一個 SIGx 信號處理例程時又接收到另一個 SIGx
   信號,這時會發生什么情況呢?一個方法是讓內核中斷該進程并再次運行該信號處理例程。為此,這個處理例程必須是可重入的(re-entrant)。但是,設計可重入的處理例程決非易事。ANSI
   C 解決重現信號(recurring signals)問題的方法是在執行用戶定義的處理例程前,將處理例程重置為 STG_DFL。這樣做是有問題的。
   當兩個信號快速產生時,內核運行第一個信號的處理例程,而對第二個信號則進行默認處理,這樣有可能終止該進程。
   在過去的三十年中出現了幾個可以信號處理框架,每一種框架對重現信號的處理問題提供了不同的解決方法。POSIX 信號 API
   是其中最為成熟的和可移植的一個。
  
   POSIX 信號
   POSIX 信號處理函數操作一組打包在 sigset_t 數據類型中信號:
   int sigemptyset(sigset_t * pset); 清除 pset 中的所有信號。
   int sigfillset(sigset_t * pset); 用可獲得的信號填充 pset。
   int sigaddset(sigset_t * pset, int signum); 將 signum 添加到 pset。
   int sigdelset(sigset_t * pset, int signum); 從 pset 中刪除 signum。
   int sigismember(const sigset_t * pset, int signum); 如果 signum 包含在
   pset 中,則返回非零,否則返回 0。
  
   Sigaction() 為特定的信號注冊處理例程:
   int sigaction(int signum, struct sigaction * act, struct sigaction *prev);
   sigaction 結構描述內核處理 signum 的信息:struct sigaction
  {
  ? sighanlder_t sa_hanlder;
  ? sigset_t sa_mask; // 阻塞信號的清單
  ? unsigned long sa_flags; // 阻塞模式
  ? void (*sa_restorer)(void); // 未使用
  };
   sa_hanlder 保存函數的地址,該函數帶一個整型參數,沒有返回值。它還可以是兩個特別值之一:SIG_DFL 和 SIG_IGN。
  
   額外特性
   POSIX API 提供多種 ANSI 庫中所沒有的服務。其中包括阻塞進入的信號并獲取當前未決信號。
  
  
   阻塞信號
   sigprocmask() 阻塞和取消阻塞信號:int sigprocmask(int mode, const sigset_t* newmask,sigset_t * oldmask);
   mode 可取以下值之一:
   SIG_BLOCK —— 將 newmask 中的信號添加到當前的信號擋板中。
   SIG_UNBLOCK —— 從當前的信號擋板中刪除 newmask 信號。
   SIG_SETMASK —— 僅阻塞 newmask 中的信號。
   獲取未決信號
   阻塞的信號處于等待狀態,直到進程就緒接收它們。這樣的信號被稱為未決信號,可以通過調用 sigpending() 來獲取。
   int sigpending(sigset_t * pset);
  
作者簡介
   Danny Kalev 是一名通過認證的系統分析師,專攻 C++ 和形式語言理論的軟件工程師。1997 年到 2000
   年期間,他是 C++ 標準委員會成員。最近他以優異成績完成了他在普通語言學研究方面的碩士論文。
   業余時間他喜歡聽古典音樂,閱讀維多利亞時期的文學作品,研究 Hittite、Basque 和 Irish Gaelic
   這樣的自然語言。其它興趣包括考古和地理。Danny 時常到一些 C++ 論壇并定期為不同的 C++
   網站和雜志撰寫文章。他還在教育機構講授程序設計語言和應用語言課程。

posted on 2006-09-28 09:55 Khan 閱讀(1241) 評論(0)  編輯 收藏 引用 所屬分類: GCC/G++ 、跨平臺開發

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线观看国产欧美| 99亚洲精品| 亚洲精品一区二区三区99| 国产精品一区二区三区久久 | 亚洲精品欧美激情| 91久久精品国产91久久| 99re66热这里只有精品4| 夜夜嗨av色一区二区不卡| 亚洲女人av| 男女av一区三区二区色多| 最新国产乱人伦偷精品免费网站 | 欧美日韩蜜桃| 国产精品成人一区二区| 国产午夜一区二区三区| 亚洲国产女人aaa毛片在线| 一本色道久久综合亚洲91| 欧美一级理论片| 欧美激情免费在线| 亚洲一区二区欧美日韩| 另类尿喷潮videofree| 欧美日韩午夜精品| 激情成人av| 亚洲欧美bt| 欧美不卡视频一区| 宅男噜噜噜66一区二区66| 久久久九九九九| 欧美三级日本三级少妇99| 一区二区三区在线观看国产| 久久久久久久国产| 欧美成人性生活| 国产精品亚洲网站| 亚洲麻豆视频| 免费不卡视频| 亚洲欧美日韩视频二区| 欧美激情一区二区三级高清视频| 国产区欧美区日韩区| 一区二区三区高清不卡| 欧美成年人视频网站欧美| 一区二区三区视频免费在线观看| 久久女同互慰一区二区三区| 国产精品欧美一区二区三区奶水| 99精品福利视频| 欧美电影在线免费观看网站 | 欧美精品大片| 在线免费观看一区二区三区| 亚洲欧美日韩一区| 日韩午夜激情| 欧美国产一区在线| 亚洲黄色av一区| 欧美成人首页| 久久久xxx| 黄色免费成人| 欧美一区二区黄色| 一区二区三区黄色| 欧美午夜精品久久久久久孕妇| 亚洲啪啪91| 欧美成人午夜影院| 老**午夜毛片一区二区三区| 在线观看国产欧美| 亚洲电影第1页| 欧美成人午夜激情| 99精品国产一区二区青青牛奶 | 日韩一区二区久久| 欧美日韩亚洲系列| 亚洲网站在线观看| 一本色道久久综合狠狠躁篇怎么玩 | 久热精品视频在线观看| 欧美一区二区三区免费观看 | 国产亚洲午夜| 久久夜色精品国产亚洲aⅴ| 久久精品99国产精品酒店日本| 一区国产精品| 亚洲国产成人精品女人久久久 | 99国产精品久久久久老师| 欧美日本韩国一区二区三区| 日韩亚洲国产精品| 亚洲图片欧洲图片av| 国产欧美1区2区3区| 国产日韩欧美精品在线| 久久精品综合一区| 久久在线视频在线| 一区二区高清视频| 午夜精品一区二区三区在线视| 国语自产精品视频在线看一大j8| 久久一二三四| 欧美日韩成人激情| 久久精品日韩欧美| 欧美寡妇偷汉性猛交| 亚洲欧美日韩国产综合| 久久久久成人精品免费播放动漫| 日韩亚洲欧美一区二区三区| 亚洲一区三区在线观看| 尤物精品在线| 中国女人久久久| 亚洲国产精品va| 亚洲综合不卡| 亚洲美女视频在线免费观看| 亚洲欧美在线一区| 99国产精品99久久久久久粉嫩| 性欧美办公室18xxxxhd| 亚洲精品一区二区三区av| 欧美一级一区| 亚洲影院在线观看| 免费中文日韩| 久久久噜噜噜久久中文字幕色伊伊 | 久久免费午夜影院| 欧美日韩免费一区二区三区视频| 久久久久国产精品一区二区| 欧美国产一区二区三区激情无套| 久久成人免费网| 欧美日韩国产探花| 欧美成在线视频| 国产午夜精品美女视频明星a级| 亚洲国产三级| 亚洲高清激情| 久久久久久久久久久久久女国产乱 | 国产色爱av资源综合区| 亚洲日韩欧美视频一区| 亚洲成人直播| 性色av一区二区三区红粉影视| 在线亚洲自拍| 欧美精品不卡| 亚洲区欧美区| aa级大片欧美| 欧美久久婷婷综合色| 久久综合九色| 加勒比av一区二区| 久久久精品国产99久久精品芒果| 久久精品国产亚洲一区二区三区| 国产精品另类一区| 一区二区精品国产| 亚洲五月婷婷| 国产精品美女久久福利网站| 99热免费精品在线观看| 一区二区三区高清| 欧美视频在线观看免费| 9色国产精品| 亚洲一区二区在线| 亚洲欧美国产日韩中文字幕| 激情综合五月天| 久久精品理论片| 久久精品国产免费观看| 国产亚洲一区在线| 久久av一区二区三区漫画| 久久国产毛片| 激情欧美国产欧美| 久久免费视频网站| 麻豆国产精品一区二区三区| 国语自产在线不卡| 美女尤物久久精品| 亚洲精品乱码久久久久久黑人| 在线视频你懂得一区| 国产精品黄色| 久久国产精品久久w女人spa| 欧美va天堂va视频va在线| 亚洲精品久久视频| 国产精品福利在线观看| 欧美一级在线亚洲天堂| 免费成人高清视频| 一区二区三区产品免费精品久久75| 欧美视频在线视频| 欧美一区二区大片| 亚洲国产另类 国产精品国产免费| 99视频有精品| 国产在线日韩| 欧美精品久久99| 亚洲一区二区三区四区五区午夜| 久久天堂av综合合色| 亚洲精品久久视频| 国产欧美日韩精品丝袜高跟鞋| 久久午夜av| 亚洲天堂偷拍| 欧美激情精品久久久久久| 亚洲欧美日韩综合国产aⅴ| 一区福利视频| 国产精品网站在线| 欧美电影在线免费观看网站| 亚洲欧美激情在线视频| 亚洲黄色成人网| 久久亚洲一区| 欧美一级一区| 亚洲视频专区在线| 亚洲国产日韩欧美在线99| 国产农村妇女精品一区二区| 欧美国产另类| 久久婷婷蜜乳一本欲蜜臀| 亚洲午夜免费福利视频| 亚洲经典在线看| 免费欧美日韩| 久久久精品日韩| 亚洲在线视频观看| 亚洲欧洲一区二区在线播放| 国内精品久久久久久久97牛牛| 国产精品成人一区二区三区吃奶| 欧美成在线视频| 久久久久国产精品一区| 欧美一区二区免费| 亚洲欧美www| 亚洲午夜视频在线观看| 日韩亚洲精品视频|