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

Linux系統編程—信號捕捉

系統 Linux
信號的捕捉,說白了就是抓到一個信號后,執行我們指定的函數,或者執行我們指定的動作。下面詳細介紹兩個信號捕捉操作參數:signal和sigaction。

前面我們學習了信號產生的幾種方式,而對于信號的處理有如下幾種方式:

  • 默認處理方式;
  • 忽略;
  • 捕捉。

信號的捕捉,說白了就是抓到一個信號后,執行我們指定的函數,或者執行我們指定的動作。下面詳細介紹兩個信號捕捉操作參數:signal和sigaction。

[[346857]]

##signal函數

函數原型:

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

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

函數作用:注冊一個信號捕捉函數,也就是說,收到了某個信號,就執行它所注冊的回調函數。

函數參數:

  • signum:信號編號,盡量用宏來寫,而別用數字,這樣更適合跨平臺;
  • handler:注冊的回調函數;

函數缺陷:

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

  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函數

函數原型:

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

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

返回值:

成功:0;失敗:-1,并設置errno;

參數:

  • signum:信號編號,盡量用宏來寫,而別用數字,這樣更適合跨平臺;
  • act:傳入參數,新的信號捕捉方式;
  • oldact:傳出參數,舊的信號捕捉方式

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

struct sigaction結構體

原型:

  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. }; 

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

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

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

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

某個信號已經注冊了回調函數,當內核傳遞這個信號過來時,會先經過一個阻塞信號集,先阻塞掉部分信號。再去執行對應的回調函數。如下圖示:

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

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

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

再來看另外一個場景:

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

另外,阻塞的常規信號不支持排隊,也就是說,執行回調函數期間,再來千百個同個信號時,系統只記錄一次。而后面的32個實時信號則支持排隊。

  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);   //用來模擬回調函數執行很長時間 
  9.      printf("func finished!\n"); 
  10.  
  11. int main() 
  12.     struct sigaction act; 
  13.     act.sa_handler = func
  14.     sigemptyset(&act.sa_mask);  //先清空臨時阻塞信號集 
  15.     sigaddset(&act.sa_mask, SIGINT);    // 執行回調函數期間,屏蔽SIGINT 
  16.     act.sa_flags = 0
  17.  
  18.     sigaction(SIGQUIT, &act, NULL); //注冊回調函數 
  19.  
  20.     while(1); 
  21.  
  22.     return 0; 

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2020-09-25 07:34:40

Linux系統編程信號量

2020-10-08 10:10:51

Linux系統編程信號集

2020-10-05 22:01:02

Linux系統編程線程屬性

2020-09-26 21:43:59

Linux系統編程條件變量

2020-10-10 07:18:14

Linux系統編程管道

2020-10-05 22:05:10

Linux系統編程時序競態

2020-09-22 07:35:06

Linux線程進程

2020-09-26 23:09:00

Linux系統編程讀寫鎖

2020-09-28 06:49:50

Linux系統編程互斥量mutex

2016-08-16 08:26:19

Linuxsignalsigaction

2020-10-09 07:13:11

Linux系統編程mmap

2017-02-28 18:26:09

Linuxinput子系統編程

2010-03-05 13:34:54

2019-03-15 09:30:09

Linux系統CPU

2009-07-03 11:57:18

系統編程安全linux

2009-10-23 16:35:44

linux Debia

2010-02-02 13:26:53

Linux內核

2009-02-18 17:31:48

2025-04-16 04:22:00

2009-12-08 12:14:43

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91久久久久久久久久久久久 | 欧美精品久久 | 国产一区h| 欧美亚洲激情 | 欧美在线精品一区 | 在线观看国产视频 | 欧美片网站免费 | 午夜男人的天堂 | 欧美综合视频 | 91在线视频观看 | 一级大片免费 | 国产亚洲二区 | 欧美一区2区三区3区公司 | 久久91av| 在线观看特色大片免费网站 | 成人av高清在线观看 | 91偷拍精品一区二区三区 | 一级毛片在线视频 | 国产在线精品一区二区 | 成人在线视频免费看 | 99精品久久久| 亚洲国产成人精品女人久久久 | 久久午夜电影 | 亚洲高清一区二区三区 | 一区二区在线不卡 | 午夜精品久久久久久不卡欧美一级 | 精品久久九 | 久久精品国产清自在天天线 | 国产精品国产成人国产三级 | 一区视频在线 | 久久久久久久久淑女av国产精品 | 午夜在线观看免费 | www.日韩av.com | 久久精品国产久精国产 | 日韩av在线一区二区 | 91在线视频播放 | 欧美视频免费在线 | 韩日一区二区 | 久久久久久久久久久久久久久久久久久久 | 日韩午夜精品 | 精品久久久久久久久久久久久久 |