当前位置:K88软件开发文章中心电脑基础基础应用05 → 文章内容

Linux信号机制解析

减小字体 增大字体 作者:华军  来源:华军资讯  发布时间:2019-1-31 15:34:30

本文就来为大家简单地解析一下Linux信号机制。  1、安装信号处理函数  在系统编程的层面上与信号的处理关系最直接相关的函数有两个,他们用来安装信号处理函数:  sighandler_t signal(int signum, sighandler_t handler);  int sigaction(int signum, const struct sigaction *act,,struct sigaction *oldact);  第一个函数signal比较简单,sighandler_t 是一个别名,其原型是 typedef void (*sighandler_t)(int),他是一个函数指针,接受一个类型为int的参数(信号的编号),返回void。例如要对SIGUSR1信号进行处理:  void handler(int sig)  {  //strsiganl 功能是把信号的编号转为信号说明的字符串  printf(“Rcv a signal:%s”,strsignal(sig));  }  int main()  {  signal(SIGUSR1,handler);  while(1)  ;  }  (这段程序其实是有问题的,后面会说到)这段程序本来是一段死循环,但是对他发送SIGUSR1信号,程序会从while中“中断”转去执行handler中的代码。在shell中使用kill命令发送信号SIGUSR1 于是程序就答应出了一段这样的信息:Rcv a signal:User defined signal 1。signal()的用法几乎就是这么简单。但是由于可移植的原因,参与项目开发时,应该使用下面的这个函数。  sigaction()函数的参数中有两个结构体,其man手册原型如下:  struct sigaction {  void (*sa_handler)(int);  void (*sa_sigaction)(int, siginfo_t *, void *);  sigset_t sa_mask;  int sa_flags;  void (*sa_restorer)(void);  };  据我所知sa_handler和sa_sigaction其实是在一个union中,他们都是指向信号处理函数的指针。  sa_mask 是要屏蔽的信号,sa_flags 有多种选项。(关于这两点后文再细说)。从sigaction()原型中可以发现参数中有两个struct sigaction参数,其中act是要安装的信号处理,而oldact是用来带回原来的处理方式方便我们处理完信号后的恢复。如果不需要拿回之前的信号处理方式可以把第三个参数置为NULL,反之如果只想得到之前的处理方式而不像安装新的信号处理,可以把第二个参数置为NULL,这点用signal()是办不到的。用sigaction()改写上面的例子是这样的:  1 void handler(int sig)  2 {  3 printf(“Rcv a signal:%s”,strsignal(sig));  4 }  5  6 int main()  7 {  8 struct sigaction act;  9 sigemptyset(&act.sa_mask);  10 act.sa_handler = handler;  11 act.sa_flags = 0;  12 sigaction(SIGUSR1,&act,NULL);  13 while(1)  14 ;  15 }       好啦,以上就是华军小编带给大家的全部内容了,是不是很简单呢?你学会了么?想了解更多的相关内容,请随时关注华军资讯动态吧,欢迎到华军来下载哦!

Linux信号机制解析