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

Mik*_*age 4 posix signals sigfpe divide-by-zero

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

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

我试过用了

#include <signal.h>
...
int main(void) {
  signal(SIGFPE, SIG_IGN);
  ...
}
Run Code Online (Sandbox Code Playgroud)

但它仍然会消息"浮点异常(核心转储)".

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

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

Nie*_*jou 6

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

其次,使用SIGFPE来终止程序显然是荒谬的,因为你应该提出像SIGTERM或SIGUSR1这样的信号而不是陪审团操纵一些其他信号的副作用,而忽略它的语义价值.更具体地说,sigaction(2)的手册页有一个NOTES部分,其中包含一个关于SIGFPE的模糊信息,表示打破了它的预期用途的一种或两种方式.

当你想要终止时,你应该做的是提出(3)一个信号.然后,使用结构中的sa_handler字段sigaction来更改对该信号的ignore(SIG_IGN)或terminate(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().