我写了一个处理浮点异常信号的程序,我正在使用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);

08-16 21:49