免费注册 查看新帖 |

Chinaunix

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

[C++] 【已解决】特意测试了除0错误,signal捕获处理了SIGFPE,但是随后陷入死循环 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-22 15:17 |只看该作者 |倒序浏览
本帖最后由 pppadr 于 2013-07-23 09:35 编辑

如题,我写了个很小的程序,来测试SIGFPE如何被捕获和处理:

  1. #include<stdio.h>
  2. #include<signal.h>
  3. #include<sys/types.h>

  4. void f(int signo)
  5. {
  6.     printf("signo=%d\n",signo);
  7. }
  8. int main(int argc,char* argv[])
  9. {
  10.     signal(SIGFPE,f);
  11.     int div=argc/(argc-1);
  12.     return 0;
  13. }
复制代码
编译运行。发现程序不断的打印
signo=8
问题是,我预想这个程序只打印一次signo就应该退出啊。我的想法错在哪里?

论坛徽章:
0
2 [报告]
发表于 2013-07-22 16:16 |只看该作者

void f(int signo)

{

    printf("signo=%d\n",signo);
    signal(SIGFPE, SIG_DFL);        //这里将SIGFPE的信号变成系统默认处理就好了
}

论坛徽章:
0
3 [报告]
发表于 2013-07-22 17:33 |只看该作者
wk_g7 发表于 2013-07-22 16:16
void f(int signo)

{


谢谢,我的问题在于,既然我自定义的signal处理函数已经做了处理,难道操作系统还是会不停的发送SIGFPE给我的程序以至于会死循环吗? 我这个程序死循环的根本原因是什么呢?

论坛徽章:
0
4 [报告]
发表于 2013-07-23 09:34 |只看该作者
我找到答案了,改成下面这样,用setjmp/longjmp来越过SIGFPE所在的地方,就可以了!


  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <setjmp.h>

  4. jmp_buf env;
  5. void handler (int signal) {
  6.     printf("caught exception\n");
  7.     longjmp(env, 2);
  8. }

  9. int main(int argc, char* argv[]) {
  10.     {
  11.         struct sigaction sa = {};
  12.         sa.sa_handler = handler;
  13.         //sigemptyset(&sa.sa_mask);
  14.         //sa.sa_flags = 0;
  15.         if(sigaction(SIGFPE, &sa, NULL) == -1) {
  16.             perror("sigaction");
  17.         }
  18.     }

  19.     if (0 == setjmp(env)) {
  20.         int a = 3/(argc - 1);
  21.         printf("a is %d\n", a);
  22.     } else {
  23.         /*exception*/
  24.         printf("in exception\n");
  25.     }

  26.     return 1;
  27. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-07-23 09:47 |只看该作者
除0,属于异常,这个不可恢复. 每次系统调用你的信号处理后,还会回到除0哪里继续执行.

论坛徽章:
0
6 [报告]
发表于 2013-07-23 10:23 |只看该作者
异常控制流返回重新执行当前除0指令,5楼说的比用longjmp退出更好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP