我有一个程序故意执行除以零(并将结果存储在易失性变量中),以便在某些情况下停止。但是,我希望能够禁用此停止,而不更改执行除以零的宏。
有什么办法可以忽略它吗?
我尝试过使用
#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(使用前将#替换为@)