首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >信号处理(SIGFPE)

信号处理(SIGFPE)
EN

Stack Overflow用户
提问于 2018-03-03 08:21:15
回答 3查看 1.8K关注 0票数 1

在以下代码中:

代码语言:javascript
复制
#include <unistd.h>
#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
using namespace std;
void signal_callback_handler(int signum)

{
printf ("Caught signal %d\n", signum);
exit (signum);
}

int main()
{
signal (SIGFPE, signal_callback_handler);

int a=4;
int b=55444;

while (1)
{
printf ("Program processing stuff here.\n");
cout<<b/a;
a--;
b++;
sleep (1);
}
return EXIT_SUCCESS;
}

当变量'a‘变为0时,程序从操作系统获得SIGFPE信号,程序以消息结束:“捕捉信号8”。但是,如果我注释掉'signal_callback_handler‘定义中的"exit(signum);“行,程序就会不停地运行,并继续在屏幕上打印”捕捉信号8“语句。这一切为什么要发生?为什么这个信号会被反复产生?

我原以为信号会产生一次,经过信号处理函数之后,程序会在'cout << b/a‘语句之后恢复,然后程序将继续normally.However,因为这是不发生的,我怎样才能达到我的目标?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-03 08:34:07

在x86中,这是因为divide error is a ,这意味着当控制流返回时,程序计数器(%rip)将指向前一个错误代码的地址,而不是下一个指令。

处理SIGFPE的一个正常策略是使用setjmp从信号处理程序跳转到可恢复状态。

一个来自您自己代码的简单示例(顺便说一句,不要在信号处理程序中使用printf() ):

代码语言:javascript
复制
#include <setjmp.h>
using namespace std;

jmp_buf excep;

void signal_callback_handler(int signum)

{
longjmp(excep, 1);
}

int main()
{
signal (SIGFPE, signal_callback_handler);

int a=4;
int b=55444;

    while (1)
    {
        printf ("Program processing stuff here.\n");
        if ( setjmp(excep) == 0 ) {
            // normal control flow
            cout<<b/a;
        }
        else {
            // from longjmp
            printf("Exception caught\n");
        }
        a--;
        b++;
        sleep (1);
    }
return EXIT_SUCCESS;
}
票数 1
EN

Stack Overflow用户

发布于 2018-03-03 08:30:56

我认为gcc从信号处理程序中为您创建了一个返回点,它一直在信号处理程序中跳来跳去。您可以尝试使用gcc的no_return属性来确保您的程序不会返回到while循环中,并且可以通过调用其他函数来继续您的程序。

票数 1
EN

Stack Overflow用户

发布于 2018-03-03 08:31:22

建议SIGILL或SIGFPE等信号停止执行而不尝试恢复。

POSIX说:

进程通常从SIGBUS、SIGFPE、SIGILL或SIGSEGV信号的信号捕获函数返回后,未定义进程的行为,而这些信号不是由kill()、σraise()或was ()生成的。

在许多实现中,当处理程序完成生成异常的指令时,将重新启动它,从而生成一个新的SIGFPE,等等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49082174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档