Linux信号段错误的处理

二、信号捕获
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,仍是系统发出断信号错误,无限循环

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值