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

C 如何获得有关SIGFPE信号的更多信息?,c,unix,signals,posix,bsd,C,Unix,Signals,Posix,Bsd,这来自GNU C库参考手册 int SIGFPE SIGFPE信号报告一个致命的算术错误。这个信号 实际上包括所有算术错误,包括除零和 溢出 BSD系统为SIGFPE处理程序提供一个额外的参数 区分异常的各种原因。为了进入 对于此参数,必须定义处理程序以接受两个参数, 这意味着您必须按顺序将其转换为单参数函数类型 建立处理程序 但是没有关于如何访问额外参数的示例 我做了谷歌搜索,但什么也找不到 如何获得这些额外信息?正如EOF在评论中提到的,更好的方法是使用sigaction和SA_SIGINF

这来自GNU C库参考手册

int SIGFPE

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

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

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

我做了谷歌搜索,但什么也找不到


如何获得这些额外信息?

正如EOF在评论中提到的,更好的方法是使用
sigaction
SA_SIGINFO
标志安装信号处理程序,这不需要正式的中断类型转换,并且有一个额外的好处是正确记录,然后在第二个参数(键入
siginfo\u t
)的
si\u code
字段中,您可以确定发生了哪个浮点错误:

对于
SIGFPE
信号,可将以下值置于
si_code
中:

FPE\u INTDIV
整数除以零

FPE\u INTOVF
整数溢出

FPE\u FLTDIV
浮点除以零

FPE\u FLTOVF
浮点溢出

FPE\u FLTUND
浮点下溢

FPE\u FLTRES
浮点不精确结果

FPE\u FLTINV
浮点操作无效

FPE\u FLTSUB
下标超出范围

资料来源:


同样的列表也可以在上找到。

glibc提到的信息是一种历史机制,不可移植。在FreeBSD上,手册页面包含一个符号,表示它仅在VAX-11体系结构上受支持:

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

void  handler(sig, code, scp)
int sig, code;
struct sigcontext *scp;
这里的sig是信号号,硬件故障和陷阱会进入该信号号 按照以下定义映射。代码参数可以是常量,也可以是 对于兼容性模式故障,提供以下代码或 硬件(兼容模式)故障与其他故障不同 通过在PSL中设置PSL_CM)进行SIGILL陷阱。scp参数是一个 指向sigcontext结构(在
中定义)的指针,用于 从信号之前恢复上下文

此版本的手册页中实际上没有提供映射列表。可以在中找到它。值得注意的是,这篇文章已经有25年的历史了

在现代系统上,您应该使用sigaction机制,它的定义更加明确,可移植性更强

错误-此手册页仍然令人困惑


确实如此。

访问任何函数参数的方式都是一样的——使用您给出的形式参数的名称。@BenVoigt抱歉,我对系统编程和C不太熟悉。您的评论是什么意思?为什么不使用
sigaction()
而不是过时的(ish)
signal()
,并享受得到一个充满美好的
struct siginfo*
的乐趣吗?@RossRidge修复了标记,对不起。@KorayTugay:每个C程序都以
int main(int argc,char**argv)
开头,您可以通过它们的名称
argc
argv
访问参数。当你创建一个函数来处理你的信号时,你会给参数命名。函数名中的(2)是什么?@KorayTugay:一个手动部分。这是对
(2)
的另一种解释: