红联Linux门户
Linux帮助

对linux中signal()函数的理解

发布时间:2016-09-19 15:22:36来源:linux网站作者:yan_xinrui
信号可以看做程序运行期间的一种软件中断,信号是异步的,也就是说对于进程运行而言信号的发生是随机的,每当有信号产生时,进程会立即处理该信号。
 
人们可以通过键盘组合来发送特定的信号,比较重要的有:
SIGINT   2    采用ctrl+c产生该信号 
SIGQUIT  3    采用ctrl+\产生该信号 
SIGKILL  9    采用kill -9产生该信号 
kill -l 表示查看当前系统所支持的所有信号
 
信号产生后,对于信号的处理有三种方式:
(1)默认处理
- 绝大多数信号的默认处理方式都是终止进程
(2)忽略处理
(3)自定义处理
对哪种信号进行哪种特定的处理,这时就要用到signal()函数
 
signal函数定义:
void (*signal(int signum,void(*handler)(int)))(int)
 
这么一长串有点吓人,其实慢慢分析
首先  void(*p)(int  )表示p是一个函数指针,参数是int型,返回是void型
对于void (*signal())(int),   signal)表示的是signal函数的返回值,意思是signal函数的返回值是一个函数指针,参数是int型,返回是void型
而上面一长串的signal函数只不过是将signal函数具体的形参写了出来,意思就是signal这个函数,有两个形参,一个是int型,一个是函数指针型,这个函数指针参数为int返回为void,而它运行完之后,返回的也是一个函数指针,参数为int,返回是void,这个时候就有重大发现,这signal的第二个参数和它的返回值是一样样的形式啊,其实重要的点就在这里,我认为注意是我认为啊,要是错了各位大牛请指正别打我……这个signal()函数只不过起一个传递的作用,只要它运行正确,它运行返回的结果其实就是第二个参数里的函数指针,只不过把第一个参数int当做第二个参数函数指针的int型形参。
 
有点乱有个例子
#include <stdio.h>  
#include <stdlib.h>  
#include <signal.h>  
#include <unistd.h>  
void fa(int signo){  
printf("捕获到了信号%d\n",signo);  
}  
int main(){  
signal(SIGIN,fa);  
while(1);
return 0;
}  
 
利用ctrl+c发出SINGIN信号之后,signal函数开始执行,咋执行不管,反正最终返回的是函数指针指向fa函数,同时将SINGIN作为fa()函数的signo参数,这样程序在执行完singal()函数之后就开始执行fa函数了,这就是我认为的signal函数只起一个传递的作用。
 
上面的例子讲解的都是第三种处理方式:自定义处理,就是产生指定的信号以后,你自己定义一个让它执行的函数,而对于忽略处理和默认处理就很简单,分别为:signal(int  signum,SIG_IGN ),signal(int  signum,SIG_DFL ),其实这里的SIG_IGN和SIG_DFL也代表两个函数指针,前者表示,当检测到signum信号来到,忽略它,后者则表示当检测到signum信号时,程序立刻终止。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24300.html