免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1054 | 回复: 5

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

论坛徽章:
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
发表于 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
发表于 2015-12-19 11:14 |显示全部楼层
1,信号处理函数返回值为void,为何要return 1;
2,我在处理函数里加了返回return; 其实跟没有加一样,函数会自动加上的。函数还是会一直打印。
回复 2# seanking1987


   

论坛徽章:
1
综合交流区版块每日发帖之星
日期:2015-09-23 06:20:00
发表于 2015-12-21 21:10 |显示全部楼层
我也一直在学习中

论坛徽章:
218
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:3215-16赛季CBA联赛之上海
日期:2019-09-20 12:29:32操作系统版块每日发帖之星
日期:2016-03-02 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-05-10 19:22:58月度论坛发贴之星
日期:2016-01-31 22:25:02操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
发表于 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
发表于 2015-12-22 10:01 |显示全部楼层
本帖最后由 seanking1987 于 2015-12-22 10:04 编辑

回复 3# jieniyisheng521

是exit 1;写错了。

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

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

本版积分规则 发表回复

PostgreSQL中国大会,早鸟票抢购!

PostgreSQL中国大会,早鸟票抢购!
2019年11月29~11月30日,由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。




----------------------------------------

点击报名>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP