SIGFPE处理程序循环调用

时间:2018-08-29 05:35:12

标签: linux signals

看看这个Unix C程序:

#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 erreur。 处理程序被解雇了,那太好了。 但是,此处理程序在循环中被调用! 为什么?

谢谢

1 个答案:

答案 0 :(得分:1)

如果只是从处理程序中返回,则执行将在引发信号的那一刻继续执行,这将导致另一个除以零的错误,这将导致再次调用处理程序,依此类推。您需要安排执行以在代码的其他地方继续。传统方法是使用setjmp / longjmp,类似这样

#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上不一致。