关于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("%s\n",__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 }
~
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("%s\n",__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
haifeng@Tek-life:~/tmp$ ./a.out
Starting.........Restarting.........Restarting.........fun..........Restarting.........bar
评论
发表评论