我试图处理一个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()函数中做它需要做的任何事情,然后继续循环的下一次迭代。
这也适用于其他需要处理的信号。任何帮助都将不胜感激。
发布于 2016-09-11 01:01:18
如果您必须使用信号来处理FPE或通过调用导致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;
}https://stackoverflow.com/questions/39431879
复制相似问题