我写了一个处理浮点异常信号的程序,我正在使用Ubuntu10.4。
这是我的源代码:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
sigjmp_buf mark;
void GeneralHandler(int signo)
{
switch(signo)
{
case SIGFPE:
printf("\nERROR : Invalid Arithmetic operation.\n");
siglongjmp(mark, signo);
break;
}
exit(signo);
}
int main(void)
{
int i = 0,value = 0, ans = 0;
struct sigaction act;
act.sa_handler = GeneralHandler;
sigaction(SIGFPE, &act, NULL);
for(i = 0; i < 10; i++)
{
if(sigsetjmp(mark, 1)) continue;
printf("Value : ");
scanf("%d" ,&value);
ans = 5 / value;
printf("%d / %d = %d\n", 5, value, ans);
}
}
我使用siglongjmp和sigsetjmp方法从处理程序方法跳到for循环中的主方法。
它第一次运行良好,并显示错误:无效的算术运算。然后第二次显示浮点异常,然后退出。
程序输出:
searock@searock桌面:~/C$。/signal\u continueValue:0错误:无效的算术运算。值:0浮点异常searock@searock桌面:~/C$
我不知道我的程序出了什么问题?为什么不显示错误:无效的算术运算。第二次?有人能给我指个正确的方向吗?
最佳答案
您尚未初始化struct sigaction
可能act
包含垃圾值,例如将信号处理程序配置为SA_RESETHAND或其他错误。
Do结构
sigaction act = {};
或
memset(&act,0,sizeof act);