成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux系統(tǒng)編程—信號(hào)捕捉

系統(tǒng) Linux
信號(hào)的捕捉,說白了就是抓到一個(gè)信號(hào)后,執(zhí)行我們指定的函數(shù),或者執(zhí)行我們指定的動(dòng)作。下面詳細(xì)介紹兩個(gè)信號(hào)捕捉操作參數(shù):signal和sigaction。

前面我們學(xué)習(xí)了信號(hào)產(chǎn)生的幾種方式,而對(duì)于信號(hào)的處理有如下幾種方式:

  • 默認(rèn)處理方式;
  • 忽略;
  • 捕捉。

信號(hào)的捕捉,說白了就是抓到一個(gè)信號(hào)后,執(zhí)行我們指定的函數(shù),或者執(zhí)行我們指定的動(dòng)作。下面詳細(xì)介紹兩個(gè)信號(hào)捕捉操作參數(shù):signal和sigaction。

[[346857]]

##signal函數(shù)

函數(shù)原型:

  1. sighandler_t signal(int signum, sighandler_t handler); 

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

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

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

  • signum:信號(hào)編號(hào),盡量用宏來寫,而別用數(shù)字,這樣更適合跨平臺(tái);
  • handler:注冊(cè)的回調(diào)函數(shù);

函數(shù)缺陷:

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

  1.  #include <stdio.h> 
  2.  #include <signal.h> 
  3.  
  4.  void func() 
  5.  { 
  6.      printf("SIGQUIT catched!\n"); 
  7.  } 
  8.  
  9.  int main() 
  10.     signal(SIGQUIT, func); 
  11.     while(1); 

##sigaction函數(shù)

函數(shù)原型:

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

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

返回值:

成功:0;失敗:-1,并設(shè)置errno;

參數(shù):

  • signum:信號(hào)編號(hào),盡量用宏來寫,而別用數(shù)字,這樣更適合跨平臺(tái);
  • act:傳入?yún)?shù),新的信號(hào)捕捉方式;
  • oldact:傳出參數(shù),舊的信號(hào)捕捉方式

這里特別要注意參數(shù)中struct sigaction結(jié)構(gòu)體,這也是這個(gè)函數(shù)的難點(diǎn)所在,下面詳細(xì)說明:

struct sigaction結(jié)構(gòu)體

原型:

  1. struct sigaction {  
  2. void (*sa_handler)(int); 
  3. ​ void (sa_sigaction)(int, siginfo_t , void *);  
  4. ​ sigset_t sa_mask;  
  5. ​ int sa_flags;  
  6. ​ void (*sa_restorer)(void);  
  7. }; 

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

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

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

(2) sa_mask:臨時(shí)阻塞信號(hào)集(或信號(hào)屏蔽字)先來看這樣一個(gè)情景:

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

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

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

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

再來看另外一個(gè)場(chǎng)景:

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

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

  1.  #include <stdio.h> 
  2.  #include <signal.h> 
  3.  #include <unistd.h> 
  4.  
  5.  void func(int signal) 
  6.  { 
  7.      printf("SIGQUIT catched!\n"); 
  8.      sleep(2);   //用來模擬回調(diào)函數(shù)執(zhí)行很長(zhǎng)時(shí)間 
  9.      printf("func finished!\n"); 
  10.  
  11. int main() 
  12.     struct sigaction act; 
  13.     act.sa_handler = func
  14.     sigemptyset(&act.sa_mask);  //先清空臨時(shí)阻塞信號(hào)集 
  15.     sigaddset(&act.sa_mask, SIGINT);    // 執(zhí)行回調(diào)函數(shù)期間,屏蔽SIGINT 
  16.     act.sa_flags = 0
  17.  
  18.     sigaction(SIGQUIT, &act, NULL); //注冊(cè)回調(diào)函數(shù) 
  19.  
  20.     while(1); 
  21.  
  22.     return 0; 

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2020-09-25 07:34:40

Linux系統(tǒng)編程信號(hào)量

2020-10-08 10:10:51

Linux系統(tǒng)編程信號(hào)集

2020-10-05 22:01:02

Linux系統(tǒng)編程線程屬性

2020-09-26 21:43:59

Linux系統(tǒng)編程條件變量

2020-10-10 07:18:14

Linux系統(tǒng)編程管道

2020-09-22 07:35:06

Linux線程進(jìn)程

2020-09-28 06:49:50

Linux系統(tǒng)編程互斥量mutex

2020-09-26 23:09:00

Linux系統(tǒng)編程讀寫鎖

2020-10-05 22:05:10

Linux系統(tǒng)編程時(shí)序競(jìng)態(tài)

2016-08-16 08:26:19

Linuxsignalsigaction

2020-10-09 07:13:11

Linux系統(tǒng)編程mmap

2017-02-28 18:26:09

Linuxinput子系統(tǒng)編程

2010-03-05 13:34:54

2019-03-15 09:30:09

Linux系統(tǒng)CPU

2009-07-03 11:57:18

系統(tǒng)編程安全linux

2009-10-23 16:35:44

linux Debia

2010-02-02 13:26:53

Linux內(nèi)核

2009-02-18 17:31:48

2025-04-16 04:22:00

2014-04-30 11:24:31

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩精品一区二区三区中文在线 | 成人亚洲网 | 在线国产一区二区三区 | 人人做人人澡人人爽欧美 | 亚洲精品电影网在线观看 | 超碰天天 | 一级一级一级毛片 | 国产视频在线观看一区二区三区 | 成人免费三级电影 | 午夜影院 | 欧产日产国产精品视频 | 亚洲视频免费 | 精品一区二区三区在线观看国产 | 国产成人精品999在线观看 | www久| 91精品久久久久久久久中文字幕 | 国产在线成人 | 亚洲欧美一区二区三区国产精品 | 欧美一区二区 | 色综合天天天天做夜夜夜夜做 | 国产99热精品 | 不卡的av在线 | 久久www免费视频 | 国产精品久久久乱弄 | 欧美综合一区 | 久久久久国产精品www | 91高清视频在线 | 成人小视频在线免费观看 | 亚洲精品99 | 91在线精品秘密一区二区 | 国产99在线 | 欧美 | 日本黄色大片免费看 | 欧美大片在线观看 | 中文字幕高清av | 国产精品成人一区二区三区夜夜夜 | 999久久 | 日本不卡高字幕在线2019 | 国产亚洲精品久久午夜玫瑰园 | 91精品国产综合久久久久久漫画 | 国产精品18毛片一区二区 | 欧美不卡一区 |