关于setjmp和longjmp

原创文章,转载请注明出处.转载自: Li Haifeng's Blog
本文链接地址: 关于setjmp和longjmp

前段时间看C专家编程遇到setjmp和longjmp,没有特别在意.这两天看深入理解计算机系统,再次提到setjmp和longjmp.觉得很巧妙,写个小程序测试一下其特性:
  1 //longjmp每一次都跳到setjmp的地方,正所谓是保存了当时的堆栈情况
  2 //如此看来,setjmp和longjmp的配对,和fork()函数有可比性:
  3 //fork()一个函数执行两次,返回两个不同的值,一个是0,一个是subprocess id.
  4 //而,longjmp则跳转到setjmp的位置,setjmp返回的值第一次是0,以后就由longjmp的参数决定
  5
  6 #include <stdio.h>
  7 #include <setjmp.h>
  8 #include <stdlib.h>
  9
 10 sigjmp_buf buf;
 11
 12 void fun()
 13 {
 14         printf(“%s……….”,__func__);
 15         longjmp(buf, 2);
 16         exit(0);
 17 }
 18 void bar()
 19 {
 20         printf(“%sn”,__func__);
 21         exit(0);
 22 }
 23
 24 void main()
 25 {
 26
 27         int n;
 28         printf(“Starting………”);
 29         n=setjmp(buf);//第一次返回为0,下一次调用的情景是遇到longjmp,返回值为longjmp的第二个参数
 30         printf(“Restarting………”);
 31         if(n ==1)
 32                 fun();
 33         if(n ==2 )
 34                 bar();
 35
 36         while(1)
 37         {
 38                 longjmp(buf,1);
 39                 printf(“I cannot appear.n”);
 40         }
 41         exit(0);
 42 }
~                                            
输出:
haifeng@Tek-life:~/tmp$ ./a.out
Starting………Restarting………Restarting………fun……….Restarting………bar

From Li Haifeng's Blog, post 关于setjmp和longjmp

Post Footer automatically generated by wp-posturl plugin for wordpress.

分享到: