1、函数原型理解
void (*signal(int sig,void(*func)(int)))(int);
指定使用sig指定的信号编号处理信号的方法。
signal函数的返回值是函数指针。
比如说,void * myfunc(); 我们说myfunc函数的返回值类型是void*
同样, 函数指针的形式举例:
void (* )(int)
*边上的空白处可以填写变量名或者函数名,
我们将signal函数带入空白处,就是如上的形式了。
简化一下:typedef void (*sighandler)(int);----->将 void (*) (int) 用sighandler代替;
void (*signal(int sig,void(*func)(int)))(int);------>void (*signal(int sig,sighandler handler)(int);
再简化:
void (*signal(int sig,sighandler handler)(int);----------------->sighandler signal(int sig,sighandler handler);
可以先想象signal()这个函会先执行,执行完毕后剩下的int ( * )()就是signal的返回值类型,很显然这个类型是个函数指针。
小结:困扰的地方在于,函数的返回值为函数指针,而函数指针的形式,当我们带入函数进去的时候,函数名是是在函数指针里面的,这个不同于普通的指针返回值。
handler指定程序可以处理信号的三种方式之一:
默认处理(SIG_DFL): 信号由该特定信号的默认动作处理
忽略信号(SIG_IGN): 忽略信号,即使没有意义,代码执行仍然继续。
函数处理程序: 定义一个特定的函数来处理信号
2、函数参数说明:
第一个参数是要捕捉的信号(查看信号:kill -l,9号SIGKILL信号不能被捕捉);
第二个参数表示我们要对信号进行的处理方式。
1)忽略信号//如:忽略Ctrl+c信号
int main()
{
signal(2,SIG_IGN);//忽略信号
while(1)
{
printf("aaaaa");
sleep(6);
}
return 0;
}
2) 默认动作
int main()
{
signal(2,SIG_DFL);//默认处理信号
while(1)
{
printf("aaaaa");
sleep(6);
}
return 0;
}
3)自定义处理函数//捕捉到这个信号后,按照handler处理函数进行操作
#include<signal.h>
void handler(int signo)
{
printf("signal:%d\n:",signo);
}
int main()
{
signal(2,handler);
while(1)
{
printf("hello world\n");
sleep(6);
}
return 0;
}