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

标签 signals posix divide-by-zero sigfpe

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

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

我尝试过使用

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

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

我实际上并没有使用这个值,所以我并不关心分配给变量的内容; 0、随机、未定义...

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

最佳答案

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

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

当你想要终止时,你应该做的是raise(3)一个信号。然后,使用 sigaction 结构中的 sa_handler 字段来更改是否忽略 (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()

关于signals - 我可以忽略除以零产生的 SIGFPE 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/419527/

相关文章:

java - catch block 中除以零时不会引发异常

c - 在对随机数取对数时避免在 C 中被零除

python - 如何在 Windows 上捕获 PyCharm 中的停止按钮?

c - Ping-pong 在 POSIX 中使用 kill 和 flags

c++ - 用 C++ 中的文件指针替换 stdout 和 stdin?

c++ - mmap 和 C++ 严格的别名规则

c++ - 如何处理SIGABRT信号?

c - C中的信号处理——中断中的中断

c - C 中的 POSIX 到 DOS 以及 DOS 到 POSIX 路径转换

python - Pandas/numpy 加权平均 ZeroDivisionError