我编写了一个信号处理程序来捕获 FPE 错误。即使发生这种情况,我也需要继续执行。我收到一个 ucontext_t 作为参数,我可以将错误的操作数从 0 更改为另一个值,但 FPU 上下文仍然很糟糕,我遇到了无限循环?
有人已经在 Linux 上操纵 ucontext_t 结构了吗?
我终于找到了一种通过清除 ucontext_t 的状态标志来处理这些情况的方法,如下所示:
...
const long int cFPUStatusFlag = 0x3F;
aContext->uc_mcontext.fpregs->sw &= ~cFPUStatusFlag;
...
取反 0x3F 将 0 放入 FPU (x87) 的状态寄存器的 6 位。这样做意味着在计算后检查 FPE 异常。