这来自 GNU C Library Reference Manual
int SIGFPE
SIGFPE信号报告致命的算术错误。这个信号 实际上涵盖了所有算术错误,包括除以零和 溢出。
BSD系统为SIGFPE处理程序提供了额外的参数 区分异常的各种原因。为了访问 这个参数,你必须定义处理程序来接受两个参数, 这意味着您必须按顺序将其转换为单参数函数类型 建立处理程序。
但是没有关于如何访问额外参数的示例。
我做了谷歌工作,但找不到任何东西。
我如何获得这些额外信息?
答案 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 - 本手册页仍然令人困惑。
确实是。