这是来自的GNU图书馆参考手册
int SIGFPE SIGFPE信号报告一个致命的算术错误。这个信号实际上涵盖了所有算术错误,包括除以零和溢出。 BSD系统为SIGFPE处理程序提供了一个额外的参数,用于区分异常的各种原因。为了访问此参数,必须定义处理程序以接受两个参数,这意味着必须将其转换为单参数函数类型,以便建立处理程序。
但是,没有关于如何访问额外参数的示例。
我做了我的谷歌工作,但什么也找不到。
我怎样才能得到这些额外的信息?
发布于 2015-06-03 18:54:56
正如注释中所提到的,更好的方法是使用sigaction和SA_SIGINFO标志安装信号处理程序,然后在第二个参数(siginfo_t类型)的si_code字段中确定发生了哪些浮点错误:
对于一个
si_code信号,可以在SIGFPE中放置以下值:FPE_INTDIV整数除以零。FPE_INTOVF整数溢出。FPE_FLTDIV浮点除以零.FPE_FLTOVF浮点溢出.FPE_FLTUND浮点底流.FPE_FLTRES浮点不精确结果。FPE_FLTINV浮点无效操作.FPE_FLTSUB子脚本超出范围。
来源:Linux sigaction(2)手册页
同样的列表在FreeBSD siginfo手册页上也很容易获得。
发布于 2015-06-03 19:27:01
glibc所指的信息是一个历史机制,是不可移植的。在FreeBSD上,西格维克(2)手册页面包含一个符号,它仅在VAX-11体系结构中被支持:
在VAX-11上,可以声明处理程序例程: void处理程序( sig,code,scp) int sig,code;struct *scp; 这里,sig是信号号,硬件故障和陷阱被映射到其中,如下所定义。代码参数要么是下面给出的常量,要么是硬件提供的兼容性模式错误(兼容性模式故障通过在PSL_CM中设置来区别于其他SIGILL陷阱)。scp参数是指向σ上下文结构(在
<signal.h>中定义)的指针,用于从信号之前恢复上下文。
映射列表实际上没有在此版本的手册中提供。它可以在4.3BSD-Reno信号(3)手册中找到。值得注意的是,这篇文章已经有25年历史了。
在现代系统中,您应该使用sigaction机制,它的定义和可移植性都要好得多。
错误-这个手册页仍然令人困惑。
的确如此。
https://stackoverflow.com/questions/30628167
复制相似问题