我正在尝试处理 SIGFPE
信号,但我的程序只是崩溃或永远运行。我必须使用 signal()
而不是其他的,比如 sigaction()
。
所以在我的代码中我有:
#include <stdio.h>
#include <signal.h>
void handler(int signum)
{
// Do stuff here then return to execution below
}
int main()
{
signal(SIGFPE, handler);
int i, j;
for(i = 0; i < 10; i++)
{
// Call signal handler for SIGFPE
j = i / 0;
}
printf("After for loop");
return 0;
}
基本上,每次除以 0 时我都想进入处理程序。它应该在 handler()
函数内执行任何需要的操作,然后继续循环的下一次迭代。
这也适用于其他需要处理的信号。任何帮助,将不胜感激。
最佳答案
如果您必须使用信号来处理 FPE 或您通过调用导致它的 CPU 废话直接导致的任何其他信号,则仅定义如果您从信号处理程序退出程序或使用 longjmp 获取会发生什么出。
还要注意恢复函数的确切位置,在计算分支的末尾但在句柄分支的开头。
不幸的是,您根本不能像这样使用 signal();第二次调用导致代码下降。如果您打算多次处理信号,则必须使用 sigaction。
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <string.h>
jmp_buf fpe;
void handler(int signum)
{
// Do stuff here then return to execution below
longjmp(fpe, 1);
}
int main()
{
volatile int i, j;
for(i = 0; i < 10; i++)
{
// Call signal handler for SIGFPE
struct sigaction act;
struct sigaction oldact;
memset(&act, 0, sizeof(act));
act.sa_handler = handler;
act.sa_flags = SA_NODEFER | SA_NOMASK;
sigaction(SIGFPE, &act, &oldact);
if (0 == setjmp(fpe))
{
j = i / 0;
sigaction(SIGFPE, &oldact, &act);
} else {
sigaction(SIGFPE, &oldact, &act);
/* handle SIGFPE */
}
}
printf("After for loop");
return 0;
}
关于C 处理信号 SIGFPE 并继续执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39431879/