linux c 之signal 和sigaction区别

简介: http://blog.csdn.net/muge0913/article/details/7331129   要对一个信号进行处理,就需要给出此信号发生时系统所调用的处理函数。可以对一个特定的信号(除去SIGKILL和SIGSTOP信号)注册相应的处理函数。

http://blog.csdn.net/muge0913/article/details/7331129

 

要对一个信号进行处理,就需要给出此信号发生时系统所调用的处理函数。可以对一个特定的信号(除去SIGKILL和SIGSTOP信号)注册相应的处理函数。注册某个信号的处理函数后,当进程接收到此信号时,无论进程处于何种状态,就会停下当前的任务去执行此信号的处理函数。

 

1、注册信号函数。

 

[cpp]  view plain copy print ?
 
  1. #include<signal.h>  
  2.   
  3. void(*signal(int signumber,void ((*func)(int))(int)  

 

 

signumber表示信号处理函数对应的信号。func是一个函数指针。此函数有一整型参数,并返回void型。其实func还可以取其他定值如:SIG_IGN,SIG_DFL.

SIG_IGN表示:忽略signumber所指出的信号。SIG_DFL表示表示调用系统默认的处理函数。signal函数的返回值类型同参数func,是一个指向某个返回值为空并带有一个整型参数的函数指针。其正确返回值应为上次该信号的处理函数。错误返回SIG_ERR

signal示例如下:

 

[cpp]  view plain copy print ?
 
  1. #include <stdio.h>  
  2.   
  3. #include <sys/types.h>  
  4.   
  5. #include <stdlib.h>   
  6.   
  7. #include <signal.h>   
  8.   
  9. void func(int sig)   
  10. {  
  11. printf("I get asignal!\n");  
  12. }   
  13. int main()   
  14. {    charbuffer[100];   
  15.   
  16.    if(signal(SIGINT, func) == SIG_ERR)  
  17.      {  
  18.      printf("signalerror exit now\n");  
  19.      exit(0);  
  20.      }  
  21.      printf("pid:%ld\n",(long)getpid());  
  22.   
  23.    for(;;)  
  24.   
  25.      {  
  26.   
  27.      fgets(buffer,sizeof(buffer),stdin);  
  28.   
  29.      printf("bufferis:%s\n",buffer);  
  30.   
  31.      }  
  32.  return 0;   
  33. }   

 

 

通常情况下一个用户进程需要处理多个信号。可以在一个程序中注册多个信号处理函数。一个信号可以对应一个处理函数,同时多个信号可以对应一个处理函数。

对于SIGINT信号 我们可以用ctrl+c或ctrl+z来中断进程,来执行SIGINT注册的函数。

 

2、 高级信号处理。

在linux系统提供了一个功能更强的系统调用。

 

[cpp]  view plain copy print ?
 
  1. #include <signal.h>  
  2.   
  3. int sigaction(int signumbet,const structsigaction *act,struct sigaction *oldact)  

 

 

 此函数除能注册信号函数外还提供了更加详细的信息,确切了解进程接收到信号,发生的具体细节。

struct sigaction的定义如下:在linux2.6.39/include/asm-generic/signal.h中实现

 

[cpp]  view plain copy print ?
 
  1. struct sigaction  
  2.   
  3. {  
  4.   
  5.      void(*sa_handler)(int);  
  6.   
  7.      void(*sa_sigaction)(int,siginfo_t *,void *);  
  8.   
  9.      sigset_tsa_mask;  
  10.   
  11.      intsa_flags;  
  12.   
  13. }  

 

 

siginfo_t在linux2.6.39/include/asm-generic/siginfo.h中实现:

 

sa_flags的取值如下表,取0表示选用所有默认选项。

SA_NOCLDSTOP:用于表示信号SIGCHLD,当子进程被中断时,不产生此信号,当且仅当子进程结束时产生此信号。

SA_NOCLDWATI:当信号为SIGCHLD,时可避免子进程僵死。

SA_NODEFER:当信号处理函数正在进行时,不堵塞对于信号处理函数自身信号功能。

SA_NOMASK:同SA_NODEFER

SA_ONESHOT:当用户注册的信号处理函数被执行过一次后,该信号的处理函数被设为系统默认的处理函数。

SA_RESETHAND:同SA_ONESHOT

SA_RESTART:是本来不能重新于运行的系统调用自动重新运行。

SA_SIGINFO:表明信号处理函数是由SA_SIGACTION指定的,而不是由SA_HANDLER指定的,它将显示更多的信号处理函数信息。

 

其实sinaction完全可以替换signal函数

 

 

 

 

 

[cpp]  view plain copy print ?
 
  1. #include <stdio.h>   
  2. #include <sys/types.h>   
  3. #include <stdlib.h>    
  4. #include <signal.h>    
  5.   
  6.   
  7. void func(int sig)    
  8.   
  9. {  
  10.   
  11. printf("I get a signal!\n");   
  12.   
  13. }    
  14.   
  15. int main()    
  16.   
  17. {   char buffer[100];    
  18.   
  19.     struct sigaction act;  
  20.     act.sa_handler=func;  
  21.     sigemptyset(&act.sa_mask);  
  22.     act.sa_flags = 0;  
  23.   
  24.     if(sigaction(SIGINT,&act, NULL) == -1)  
  25.     {  
  26.     printf("sigaction error exit now\n");  
  27.     exit(0);  
  28.     }  
  29.   
  30.     printf("pid:%ld\n",(long)getpid());   
  31.   
  32.     for(;;)  
  33.     {  
  34.     fgets(buffer,sizeof(buffer),stdin);  
  35.     printf("buffer is:%s\n",buffer);  
  36.     }  
  37.   
  38.     return 0;    
  39.   
  40. }    



 

目录
相关文章
|
29天前
|
存储 Unix Linux
Linux 下文件和目录的本质区别和组成
Linux 下文件和目录的本质区别和组成
36 0
|
29天前
|
Linux API 调度
Linux系统驱动跟裸机驱动的区别
Linux系统驱动跟裸机驱动的区别
27 0
|
1月前
|
Oracle 关系型数据库 Linux
Linux下 su命令与su - 命令有什么区别?
Linux下 su命令与su - 命令有什么区别?
27 0
|
2月前
|
弹性计算 运维 安全
阿里云服务器Windows和Linux操作系统区别对比
阿里云服务器Windows和Linux操作系统区别对比,性能有差异吗?有,同配置下Linux性能要优于Windows,但这与阿里云无关,仅仅是linux和windows之间的区别。另外,阿里云提供的windows和linux操作系统均为正版授权,用户不需要额外支付许可费用,如何选择?看用户自己的应用程序情况。
|
29天前
|
运维 网络协议 Unix
Linux终端(Terminal)与控制台(Console)的区别
Linux终端(Terminal)与控制台(Console)的区别
26 0
|
4月前
|
Unix Linux Shell
Linux下vi与vim命令使用与区别
Linux下vi与vim命令使用与区别
97 0
|
1月前
|
Unix Linux 索引
Linux 基础解惑:Linux 下文件描述符标志和文件描述符状态标志,文件状态标志,文件状态之间的区别
Linux 基础解惑:Linux 下文件描述符标志和文件描述符状态标志,文件状态标志,文件状态之间的区别
21 0
|
1月前
|
编解码 Unix Linux
【Linux C/C++ 延时(延迟)函数比较】介绍Linux系统中常用的延时函数sleep、usleep、nanosleep、select和std::sleep_for()的区别和使用场景
【Linux C/C++ 延时(延迟)函数比较】介绍Linux系统中常用的延时函数sleep、usleep、nanosleep、select和std::sleep_for()的区别和使用场景
30 1
|
1月前
|
Oracle Ubuntu Unix
Unix与Linux区别
Unix: Unix是一个操作系统家族的名称,最早由贝尔实验室(Bell Labs)的肖像电机公司(AT&T)开发。最早的Unix版本是在1969年创建的。 Linux: Linux是由芬兰计算机科学家Linus Torvalds在1991年创建的。它是作为一个免费、开放源代码的Unix克隆而开始的。
19 1
|
2月前
|
安全 Linux 数据安全/隐私保护
Linux命令 su 和 sudo 的区别
【2月更文挑战第5天】
33 0
Linux命令 su 和 sudo 的区别