LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 925|回复: 3

setjmp()和longjmp()怎么不起作用的。

[复制链接]
发表于 2010-2-7 08:55:27 | 显示全部楼层 |阅读模式
代码:
#include   "apue.h"
#include   <setjmp.h>

static void   f1(int, int, int);
static void   f2(void);

static jmp_buf   jmpbuffer;

int
main(void)
{
   int            count;
   register int   val;
   volatile int   sum;

   count = 2; val = 3; sum = 4;
   if (setjmp(jmpbuffer) != 0) //返回0表示已经储存好当前的堆栈环境,非0值表示由longjmp跳跃回来
   {
      printf("after longjmp: count = %d, val = %d, sum = %d\n",count, val, sum);
      exit(0);
   }
   count = 97; val = 98; sum = 99;
            /* changed after setjmp, before longjmp */
   f1(count, val, sum);      /* never returns */
}

static void
f1(int i, int j, int k)
{
   printf("in f1(): count = %d, val = %d, sum = %d\n", i, j, k);
   f2();
}

static void
f2(void)
{
   longjmp(jmpbuffer, 1);//void longjmp(jmp_buf env, int val);
}
/*
   val参数提供了setjmp()的返回值,这个值不能为0,如果为0,系统会用1来代替。
*/

这个东西,先把变量设置成234,然后用setjmp储存,然后改成97.98.99,打印,然后再返回到setjmp那里,再打印,。

按道理来说应该先打印97.98.99再打印2.3.4的。
但是

lucifer@LovelyBaby:~/CC/Unix$ cc testjmp.c
lucifer@LovelyBaby:~/CC/Unix$ ./a.out
in f1(): count = 97, val = 98, sum = 99
after longjmp: count = 97, val = 98, sum = 99
lucifer@LovelyBaby:~/CC/Unix$

我又哪里错了阿?
 楼主| 发表于 2010-2-7 09:22:20 | 显示全部楼层
为什么进行优化后才能体现这两个函数的作用呢?
代码:
lucifer@LovelyBaby:~/CC/Unix$ cc -O testjmp.c
lucifer@LovelyBaby:~/CC/Unix$ ./a.out
in f1(): count = 97, val = 98, sum = 99
after longjmp: count = 2, val = 3, sum = 99
lucifer@LovelyBaby:~/CC/Unix$
但是那个sum还是99???
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-2-7 09:23:38 | 显示全部楼层
e...网络不稳定。。。
回复 支持 反对

使用道具 举报

发表于 2010-2-7 09:46:58 | 显示全部楼层
Post by 13025700481;2067902

按道理来说应该先打印97.98.99再打印2.3.4的。
但是
lucifer@LovelyBaby:~/CC/Unix$ cc testjmp.c
lucifer@LovelyBaby:~/CC/Unix$ ./a.out
in f1(): count = 97, val = 98, sum = 99
after longjmp: count = 97, val = 98, sum = 99
lucifer@LovelyBaby:~/CC/Unix$

打印 97,98,99 是正确的

而打印 2,3,99 是错误的,那是由于优化造成的结果,如果属实,应为 bug。

你的错在你对 setjmp 的 save context 含义理解错误。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表