gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:33:35 25 4
gpt4 key购买 nike

我有一个程序,它故意执行除以零(并将结果存储在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com