真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Linux如何實現(xiàn)信號捕捉

這篇文章主要介紹了Linux如何實現(xiàn)信號捕捉,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于網(wǎng)站設計、成都做網(wǎng)站、孝南網(wǎng)絡推廣、微信平臺小程序開發(fā)、孝南網(wǎng)絡營銷、孝南企業(yè)策劃、孝南品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供孝南建站搭建服務,24小時服務熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com

##signal函數(shù)

函數(shù)原型:

sighandler_t signal(int signum, sighandler_t handler);

其中,sighandler定義是這樣的:typedef void (*sighandler_t)(int);

函數(shù)作用:注冊一個信號捕捉函數(shù),也就是說,收到了某個信號,就執(zhí)行它所注冊的回調(diào)函數(shù)。

函數(shù)參數(shù):

  • signum:信號編號,盡量用宏來寫,而別用數(shù)字,這樣更適合跨平臺;

  • handler:注冊的回調(diào)函數(shù);

函數(shù)缺陷:

由于歷史原因,該函數(shù)在不同版本的Unix和Linux系統(tǒng)中可能起到的效果不一樣,所以跨平臺性不佳,盡量避免使用它,取而代之使用通用性更好的sigaction函數(shù)。

 #include   #include    void func()  {      printf("SIGQUIT catched!\n");  }   int main() {     signal(SIGQUIT, func);     while(1); }

##sigaction函數(shù)

函數(shù)原型:

int sigaction(int signum, const struct sigaction act, struct sigaction oldact);

函數(shù)作用:與signal函數(shù)類似,用來注冊一個信號捕捉函數(shù);

返回值:

成功:0;失?。?1,并設置errno;

參數(shù):

  • signum:信號編號,盡量用宏來寫,而別用數(shù)字,這樣更適合跨平臺;

  • act:傳入?yún)?shù),新的信號捕捉方式;

  • oldact:傳出參數(shù),舊的信號捕捉方式

這里特別要注意參數(shù)中struct sigaction結構體,這也是這個函數(shù)的難點所在,下面詳細說明:

struct sigaction結構體

原型:

struct sigaction {  void (*sa_handler)(int);  void (sa_sigaction)(int, siginfo_t , void *);   sigset_t sa_mask;   int sa_flags;   void (*sa_restorer)(void);  };

這個結構體成員很多,又很多是回調(diào)函數(shù)的形式,令人望而生畏。但實際上,需要掌握的只有三個。

首先,sa_restorer和sa_sigaction這兩個成員一個已經(jīng)被棄用了,另一個很少使用,所以我們暫且不管它們,重點掌握剩下的三個。

(1) sa_handler:指定信號捕捉后的處理函數(shù),即注冊回調(diào)函數(shù)。該成員也可以賦值為SIG_IGN,表示忽略該信號,也可注冊為SIG_DFL,表示執(zhí)行信號的默認動作。

(2) sa_mask:臨時阻塞信號集(或信號屏蔽字)先來看這樣一個情景:

某個信號已經(jīng)注冊了回調(diào)函數(shù),當內(nèi)核傳遞這個信號過來時,會先經(jīng)過一個阻塞信號集,先阻塞掉部分信號。再去執(zhí)行對應的回調(diào)函數(shù)。如下圖示:

Linux如何實現(xiàn)信號捕捉

假如說,這個回調(diào)函數(shù)回調(diào)執(zhí)行的時間比較長,比如2秒,在這2秒里,又有其它的信號過來,那進程是暫停當前回調(diào)函數(shù),去響應新的信號,還是不管新來的信號,先把當前回調(diào)函數(shù)處理完再說?

正確的做法是,在執(zhí)行回調(diào)函數(shù)期間,使用sa_mask臨時的去替代進程的阻塞信號集,保證回調(diào)函數(shù)安心的執(zhí)行完畢,再解除替代。注意:這個過程僅僅發(fā)生在回調(diào)函數(shù)執(zhí)行期間,是臨時性的設置。

(3) sa_flags:通常設置為0,表示使用默認屬性。

再來看另外一個場景:

比如進程對SIGQUIT注冊了回調(diào)函數(shù),當回調(diào)函數(shù)在執(zhí)行期間,又來了SIGQUIT函數(shù),這時,進程是響應還是不響應該信號?這就是sa_flags的一個作用,當其設置為0時,表示使用默認屬性,也就是先不響應該信號,而是執(zhí)行完回調(diào)函數(shù)再處理此信號。

另外,阻塞的常規(guī)信號不支持排隊,也就是說,執(zhí)行回調(diào)函數(shù)期間,再來千百個同個信號時,系統(tǒng)只記錄一次。而后面的32個實時信號則支持排隊。

 #include   #include   #include    void func(int signal)  {      printf("SIGQUIT catched!\n");      sleep(2);   //用來模擬回調(diào)函數(shù)執(zhí)行很長時間      printf("func finished!\n"); }  int main() {     struct sigaction act;     act.sa_handler = func;     sigemptyset(&act.sa_mask);  //先清空臨時阻塞信號集     sigaddset(&act.sa_mask, SIGINT);    // 執(zhí)行回調(diào)函數(shù)期間,屏蔽SIGINT     act.sa_flags = 0;      sigaction(SIGQUIT, &act, NULL); //注冊回調(diào)函數(shù)      while(1);      return 0; }

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Linux如何實現(xiàn)信號捕捉”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關知識等著你來學習!


當前題目:Linux如何實現(xiàn)信號捕捉
網(wǎng)頁URL:http://weahome.cn/article/pcjopi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部