C处理信号SIGFPE并继续执行 [英] C handle signal SIGFPE and continue execution
本文介绍了C处理信号SIGFPE并继续执行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
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()
函数内执行所需的任何操作,然后继续循环的下一次迭代。
这也应该适用于需要处理的其他信号。任何帮助都将不胜感激。
推荐答案
如果您必须使用Signal来处理fpe或您通过调用导致它的cpu无意义直接引起的任何其他信号,则仅定义在您从信号处理程序退出程序或使用long jmp退出时发生的情况。
还请注意还原函数的确切位置,位于计算分支的末尾,但位于句柄分支的开头。
不幸的是,您根本不能像这样使用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并继续执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文