看看这个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。 处理程序被解雇了,那太好了。 但是,此处理程序在循环中被调用! 为什么?
谢谢
答案 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上不一致。