二、信号捕获
typedef void (*sighandler_t)(int);
功能:说明信号处理函数的格式
sighandler_t signal(int signum, sighandler_t handler);
功能:向内核注册一个信号处理函数
signum:信号编号
handler:函数指针
也可使用以下参数
SIG_IGN 忽略
SIG_DFL 按默认方式处理
返回值:
之前的信号处理方式
注意:
1、SIGKILL(9)、SIGSTOP(19)信号不能被捕获和忽略处理
2、当信号处理完后可能会返回产生信号的代码继续运行,如果我们捕获并处理段错误、算术异常等信号可能会产生死循环,正确的处理段错误、算数异常信号应该是备份数据并直接结束程序
3、有些系统通过signal注册的信号处理函数只能执行一次,如果想要持续有效,可以在信号处理函数中再重新注册一次
4、子进程会继承父进程的信号处理方式,但是通过exec系列函数创建的子进程,会恢复默认的信号处理方式
1 #include <stdio.h>
2 #include<signal.h>
3 #include<stdlib.h>
4 void sigint(int num)
5 {
6 printf("你发送了信号");
7 }
8
9 void sigquit(int num)
10 {
11 printf("%d",num);
12
13 }
14
15 void sigsegc(int num)
16 {
17 printf("错了");
18 //exit(0);
19 }
20 int main(int argc,const char* argv[])
21 {
22
23
24
25 // signal(SIGINT,sigint);
26 // signal(3,sigquit);
27 signal(11,sigsegc);
28 printf("--xxx\n");
29 int *p=NULL;
30 *p=100;//系统会发送段错误的信号,因为段错误已经被定义了,所以会一直执行> 函数,执行完之后返回 *p=NULL,还是段错误,还执行函数,一直停不下来
31 printf("%d",*p);
32 //for(;;);
33
34 return 0;
会一直打印停不下来
p=NULL,会使用虚拟空间没有映射到的空间,系统会发出段信号错误,但是段信号错误已经被我们定义成函数了,所以会执行打印(“”错了“”);
,执行后回来执行p=NULL,仍是系统发出断信号错误,无限循环