如何获得有关SIGFPE信号的更多信息?

时间:2015-06-03 18:44:15

标签: c unix signals posix bsd

这来自 GNU C Library Reference Manual

  

int SIGFPE

     

SIGFPE信号报告致命的算术错误。这个信号   实际上涵盖了所有算术错误,包括除以零和   溢出。

     

BSD系统为SIGFPE处理程序提供了额外的参数   区分异常的各种原因。为了访问   这个参数,你必须定义处理程序来接受两个参数,   这意味着您必须按顺序将其转换为单参数函数类型   建立处理程序。

但是没有关于如何访问额外参数的示例。

我做了谷歌工作,但找不到任何东西。

我如何获得这些额外信息?

2 个答案:

答案 0 :(得分:3)

作为评论中提到的EOF,更好的方法是,不需要正式破解演员表,并且正确记录奖金,是使用sigaction和{{安装信号处理程序1}}标志,然后在第二个参数的SA_SIGINFO字段中(类型si_code),您可以确定发生了哪个浮点错误:

  

siginfo_t信号可以放在si_code中以下值:

     

<强> SIGFPE             整数除以零。

     

<强> FPE_INTDIV             整数溢出。

     

<强> FPE_INTOVF             浮点除以零。

     

<强> FPE_FLTDIV             浮点溢出。

     

<强> FPE_FLTOVF             浮点下溢。

     

<强> FPE_FLTUND             浮点不精确的结果。

     

<强> FPE_FLTRES             浮点无效操作。

     

<强> FPE_FLTINV             下标超出范围。

来源:Linux sigaction(2) man page

同样的列表也可以在FreeBSD siginfo man page上找到。

答案 1 :(得分:1)

glibc所指的信息是一种历史机制,并且不可移植。在FreeBSD上,sigvec(2)手册页包含一个仅在VAX-11架构上支持的表示法:

  

在VAX-11上可以声明处理程序例程:

void  handler(sig, code, scp)
int sig, code;
struct sigcontext *scp;
     

这里sig是信号编号,硬件故障和陷阱       按以下定义映射。代码参数是常量       在下面给出,或者,对于兼容模式故障,由。提供的代码       硬件(兼容模式故障与其他故障不同       通过在psl中设置PSL_CM来捕获SIGILL。 scp参数是一个       用于指向sigcontext结构的指针(在<signal.h>中定义)       从信号之前恢复上下文。

此版本的联机帮助页中实际上未提供映射列表。它可以在4.3BSD-Reno signal(3) manpage中找到。值得注意的是,这篇文章已经有25年了。

在现代系统中,您应该使用sigaction机制,它更加明确且可移植。

  

BUGS - 本手册页仍然令人困惑。

确实是。