看看这个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错误。操控者被解雇了,这太棒了。但是,这个处理程序是在循环中调用的!为什么?
谢谢
发布于 2018-09-01 21:32:40
如果您只是从处理程序返回,则执行将在抛出信号的点处恢复,这将导致另一个被零除错误,从而导致处理程序再次被调用,依此类推。您需要安排在代码中的其他位置继续执行。传统的方法是使用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版本中并不一致。
https://stackoverflow.com/questions/52070097
复制相似问题