首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SIGFPE处理程序循环调用

SIGFPE处理程序循环调用
EN

Stack Overflow用户
提问于 2018-08-29 13:35:12
回答 1查看 92关注 0票数 1

看看这个Unix C程序:

代码语言:javascript
复制
#include <stdio.h>
#include <signal.h>

void handler(int signum)
{
    printf("Handler signum=%d\n",signum);
}

int main(int argc, char *argv)
{
    printf("Start\n");
    signal(SIGFPE, handler);
    int i=10/0;
    printf("Next\n");
    return 0;
}

如您所见,我正在将SIGFPE连接到一个处理程序。然后,我犯了一个DIV0错误。操控者被解雇了,这太棒了。但是,这个处理程序是在循环中调用的!为什么?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-01 21:32:40

如果您只是从处理程序返回,则执行将在抛出信号的点处恢复,这将导致另一个被零除错误,从而导致处理程序再次被调用,依此类推。您需要安排在代码中的其他位置继续执行。传统的方法是使用setjmp/longjmp,如下所示

代码语言:javascript
复制
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>

jmp_buf buf;

void handler(int signum)
{
  longjmp(buf, signum);
}

int main(int argc, char *argv)
{
  int rc = setjmp(buf);
  if (rc == 0) {
    printf("Start\n");
    signal(SIGFPE, handler);
    int i=10/0;
  }

  printf("Handler signum=%d\n", rc);
  printf("Next\n");
  return 0;
}

注意:这种方法非常老套,也许有人可以提出一个更好的方法来处理它。此外,调用sigaction可能比调用signal更好,因为signal的语义在不同的Unix版本中并不一致。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52070097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档