gpt4 book ai didi

linux - SIGFPE 处理程序循环调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:21 25 4
gpt4 key购买 nike

看看这个 Unix C 程序:

#include <stdio.h>
#include <signal.h>

void handler(int signum)
{
printf("Handler signum=%d\n",signum);
}

int main(int argc, char *argv)
{
printf("Start\n");
signal(SIGFPE, handler);
int i=10/0;
printf("Next\n");
return 0;
}

如您所见,我正在将 SIGFPE 连接到处理程序。然后,我做了一个 DIV0 erreur。处理程序被解雇了,这很好。但是,这个处理程序是在循环中调用的!为什么?

谢谢

最佳答案

如果您只是从您的处理程序返回,执行将在信号被抛出的点恢复,这将导致另一个被零除错误,从而导致处理程序被再次调用,依此类推。您需要安排执行以在代码中的其他某个点继续。传统的做法是使用setjmp/longjmp,像这样

#include <stdio.h>
#include <signal.h>
#include <setjmp.h>

jmp_buf buf;

void handler(int signum)
{
longjmp(buf, signum);
}

int main(int argc, char *argv)
{
int rc = setjmp(buf);
if (rc == 0) {
printf("Start\n");
signal(SIGFPE, handler);
int i=10/0;
}

printf("Handler signum=%d\n", rc);
printf("Next\n");
return 0;
}

注意:这种方法非常古老,可能有人可以建议更好的方法来处理它。此外,您最好还是调用 sigaction而不是 signal , 作为 signal 的语义在不同版本的 Unix 中不一致。

关于linux - SIGFPE 处理程序循环调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52070097/

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