gpt4 book ai didi

c - 使用 C 在 Linux 上使用 sigsetjmp 的模糊问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:43:04 27 4
gpt4 key购买 nike

出于某种原因,当我从 SIGFPE 的信号处理程序返回时,变量 i 比我预期的要小一个,以便从我的程序中获得正确的结果(遍历对数组中的所有对)我如果我从信号“catch”返回,则必须检查 sigsetjmp 的返回值并递增 i。为什么是这样?为什么在浮点异常迭代过程中发生的增量会丢失?

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

jmp_buf e;

int i;
void float_exception ();
int main ()
{
int pairs[][2] = {
{10, -5}, {10, -3}, {-10, -3}, {-10, -5}, {-10, 3}, {-10, 5}, {-10, 0},
{10, 0}, {0, 10}, {2, 3}, {3, 3}, {5, 10}
};
int npairs;
/* handle sigfpe so /0 doesn't interrupt the rest of the program */
signal (SIGFPE, float_exception);
printf ("Seeing what my C implementation does with negative or 0 modulo"
"\narithmetic.\n");
npairs = sizeof (pairs) / sizeof (int) / 2;
i = 0;

if (sigsetjmp (e, 1) != 0) {
i++; /* without this line, i is one less than I expect it to be */
}
for (; i < npairs - 1; i++) {
printf ("%d: %d %% %d\t= ", i, pairs[i][0], pairs[i][1]);
fflush (stdout);
printf ("%d\n", pairs[i][0] %pairs[i][1]);
fflush (stdout);
}
return 0;
}



void float_exception ()
{
printf ("fpe\n");
fflush (stdout);
longjmp (e, 1);
}

最佳答案

我觉得很合适。 “正常”i++ 发生在 for() 循环的末尾 - 如果您调用 longjmp(e,1) 则跳过它。

关于c - 使用 C 在 Linux 上使用 sigsetjmp 的模糊问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1159172/

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