0

根据 UNIX 高级编程文档,SIGFPE 信号终止程序并生成核心文件。

这是我的程序

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

static void sig_fpe(int signo);

int
main()
{
        int pid;

        if(signal(SIGFPE, sig_fpe) == SIG_ERR)
                printf("Signal error\n");

        pid = 10;
        pid = pid / 0;

        exit(0);
}

static void
sig_fpe(int signo)
{
        if(signo == SIGFPE){

                printf("SIGFPE signal catch\n");
        }
}

当我在 linux 机器上运行这个程序时,它会反复打印“SIGFPE signal catch”并且不会终止。样本输出为

SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
.
.
.
.

问题是什么?

4

1 回答 1

3

这有点棘手SIGFPE。当SIGFPE被捕获时,如果你只是从处理程序返回,指令将被重新执行——这非常依赖于平台,但信号的手册页提到了未定义的行为。

见这里:Unix 表示怀疑 - 关于以下程序的执行

如果您还需要核心文件,则需要重新安装默认信号处理程序,请参阅Linux:处理分段错误并获取核心转储,并启用核心文件(在 Unix 上完成ulimit -c ...

于 2014-05-15T05:28:11.127 回答