免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1461 | 回复: 5
打印 上一主题 下一主题

[学习分享] 为何捕捉到SIGSEGV信号后程序不终止 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-12-16 21:33 |只看该作者 |倒序浏览



写了一个小程序,意在发生segment fault后捕捉SIGSEGV信号,可是程序却一直运行不终止了。为何?
程序如下:


#include<stdio.h>
#include<signal.h>

void sig_cap(int signo, siginfo_t *p_info, void *info) {
        printf("caputre signo: %d\n", signo);
        printf("sigal number is:%d\n", p_info->si_signo);
        printf("pid is %d\n", p_info->si_pid);
}

void sig_reg(int signo) {
        struct sigaction sa;

        sa.sa_flags = SA_SIGINFO;
        sigemptyset(&sa.sa_mask);
        sa.sa_sigaction = sig_cap;
        sigaction(signo, &sa, NULL);
}

int main(int argc,char *argv[]){
        int *p = NULL;

        sig_reg(SIGSEGV);
        sig_reg(SIGINT);
        sig_reg(SIGQUIT);
       
        printf("pid = %d\n", getpid());

        *p = 2;
       
        return 0;
}

gcc sigsegv.c -o sigsegv
./sigsegv

运行sigsegv后,程序一直打印,不终止。打印如下:

caputre signo: 11
sigal number is:11
pid is 0
caputre signo: 11
sigal number is:11
pid is 0
caputre signo: 11
sigal number is:11
pid is 0
caputre signo: 11
sigal number is:11
pid is 0
caputre signo: 11
sigal number is:11
pid is 0
caputre signo: 11
sigal number is:11
pid is 0
caputre signo: 11
sigal number is:11
pid is 0

论坛徽章:
5
金牛座
日期:2015-07-03 13:32:00卯兔
日期:2015-07-03 13:32:17程序设计版块每日发帖之星
日期:2015-11-29 06:20:0015-16赛季CBA联赛之同曦
日期:2015-12-15 09:36:06CU十四周年纪念徽章
日期:2016-07-06 17:18:48
2 [报告]
发表于 2015-12-17 11:01 |只看该作者
回复 1# jieniyisheng521
  1. void sig_cap(int signo, siginfo_t *p_info, void *info) {
  2.         printf("caputre signo: %d\n", signo);
  3.         printf("sigal number is:%d\n", p_info->si_signo);
  4.         printf("pid is %d\n", p_info->si_pid);

  5.     return 1;
  6. }
复制代码
自定义信号处理函数加个返回。

这个问题应该在C/C++板块问吧   

论坛徽章:
0
3 [报告]
发表于 2015-12-19 11:14 |只看该作者
1,信号处理函数返回值为void,为何要return 1;
2,我在处理函数里加了返回return; 其实跟没有加一样,函数会自动加上的。函数还是会一直打印。
回复 2# seanking1987


   

论坛徽章:
1
综合交流区版块每日发帖之星
日期:2015-09-23 06:20:00
4 [报告]
发表于 2015-12-21 21:10 |只看该作者
我也一直在学习中

论坛徽章:
224
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:1015-16赛季CBA联赛之四川
日期:2023-07-25 16:53:45操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
5 [报告]
发表于 2015-12-21 22:36 来自手机 |只看该作者
内核不太懂,是有一些情况,很难搞
kill有时候都没反应。。。

论坛徽章:
5
金牛座
日期:2015-07-03 13:32:00卯兔
日期:2015-07-03 13:32:17程序设计版块每日发帖之星
日期:2015-11-29 06:20:0015-16赛季CBA联赛之同曦
日期:2015-12-15 09:36:06CU十四周年纪念徽章
日期:2016-07-06 17:18:48
6 [报告]
发表于 2015-12-22 10:01 |只看该作者
本帖最后由 seanking1987 于 2015-12-22 10:04 编辑

回复 3# jieniyisheng521

是exit 1;写错了。

我gdb跟踪发现是处理完11还是处理11,至于为什么是这样的情况我也不清楚了。

最好到C/C++版块问下,那边大神多
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP