我可以忽略除以零产生的 SIGFPE 吗?

2024-01-29

我有一个程序故意执行除以零(并将结果存储在易失性变量中),以便在某些情况下停止。但是,我希望能够禁用此停止,而不更改执行除以零的宏。

有什么办法可以忽略它吗?

我尝试过使用

#include <signal.h>
...
int main(void) {
  signal(SIGFPE, SIG_IGN);
  ...
}

但它仍然死亡并显示消息“浮点异常(核心转储)”。

我实际上并不使用该值,因此我并不关心分配给该变量的内容; 0、随机、未定义...

编辑:我知道这不是最便携的,但它适用于在许多不同操作系统上运行的嵌入式设备。默认停止操作是除以零;其他平台需要不同的技巧来强制看门狗引起的重新启动(例如禁用中断的无限循环)。对于 PC(linux)测试环境,我想禁用除零时的停止,而不依赖于像断言这样的东西。


好的,首先,您应该使用 sigaction(2) 而不是已弃用的signal().

其次,使用 SIGFPE 来终止程序显然是荒谬的,因为您应该发出像 SIGTERM 或 SIGUSR1 这样的信号,而不是临时操纵其他一些信号来消除其副作用并忽略其语义价值。更具体地说,sigaction(2) 的手册页有一个“注释”部分,其中包含有关 SIGFPE 的简介,表明您对其预期用途的一两种破坏方式。

当你想要终止时,你应该做的是raise(3)一个信号。然后,使用sa_handler领域中的sigaction结构体改变是否忽略(SIG_IGN) 或终止 (SIG_DFL)在该信号上。



int main(void) {
  struct sigaction my_action;

  my_action.sa_handler = SIG_IGN;
  my_action.sa_flags = SA_RESTART;
  sigaction(SIGUSR1, &my;_action, NULL);

  raise(SIGUSR1);  /* Ignored */

  my_action.sa_handler = SIG_DFL;
  sigaction(SIGUSR1, &my;_action, NULL);

  raise(SIGUSR1); /* Terminates */

  return 0;
}
  

也就是说,我不明白为什么你要使用信号而不是简单的exit().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以忽略除以零产生的 SIGFPE 吗? 的相关文章

随机推荐