C 处理信号 SIGFPE 并继续执行

标签 c signals

我正在尝试处理 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/

相关文章:

c++ - 如何在 C(或 C++)应用程序中接收和解码 SNMP 陷阱?

c - 从多个库动态加载时静态存储持续时间对象的唯一性保证

c - 使用 GDB 查找信号处理函数?

c++ - Qt5 lambda 连接内存泄漏的新信号

c++ - 如何将作业/线程与崩溃隔离开来

c - 看门狗在高中断率时触发

ios - 如何将 xcode 中导入的 .db 文件直接移动到 iPhone

c - fflush(stdin) 在 C 编程中做什么?

c - 如何在 C 中恢复原始信号处理属性

c - 将 strupr(...) 与 GCC 编译器一起使用时出现段错误