C处理信号SIGFPE并继续执行 [英] C handle signal SIGFPE and continue execution

查看:12
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆