Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6352
  • 博文数量: 5
  • 博客积分: 145
  • 博客等级: 入伍新兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-01 22:28
文章分类
文章存档

2012年(5)

我的朋友
最近访客

分类: LINUX

2012-12-02 13:21:56

int setjmp(jmp_buf env)
void longjmp(jmp_buf env,int val)
setjmp与longjmp结合使用时,最大用途是错误恢复,只要还没有从主函数退出,一旦发现一个不可恢复的错误,可以把主控制转移大主函数循环,并从那从新开始。

它们必须有严格的先后执行顺序,也即先调用setjmp函数,之后再调用longjmp函数,以恢复到先前被保存的“程序执行点”。否则,如果在setjmp调用之前,执行longjmp函数,将导致程序的执行流变的不可预测,很容易导致程序崩溃而退出。
 
longjmp函数中的参数env是由setjmp函数所保存的堆栈环境,参数val设置setjmp函数的返回值。longjmp函数本身是没有返回值的,它执行后跳转到保存envb参数setjmp函数调用,并由setjmp函数调用返回,此时setjmp函数的返回值就是val。
 
  setjmp与longjmp的使用场合:
1.人们对于goto语句的忌讳,很多的专业书籍以及专业人士号召限制goto语句的使用,此时,setjmp与longjmp对goto语句有了很好的替代作用.
2.goto语句有一个局限性,它只能在函数内部跳转.而setjmp与longjmp可以在整个程序全局中跳转,实现"长跳转",弥补了goto功能的局限.
3.使用setjmp和longjmp可以捕捉程序中的异常,并采取异常处理机制.
一个例子  使用setjmp,longjmp处理异常.
  1 #include
  2 #include
  3 jmp_buf jumper;
  4 void exception();
  5 int deal_exception();
  6
  7 main()
  8 {
  9         int value;
 10         int i=0;
 11
 12         value=setjmp(jumper);
 13         if(0==value){
 14                 exception();
 15         }
 16         else{
 17                 switch(value)
 18                 {
 19                         case 1:
 20                                 printf("解决异常情况[%d]\n",value);
 21                                 break;
 22                         case 2:
 23                                  printf("解决异常情况[%d]\n",value);
 24                                  break;
 25                         case 3:
 26                                  printf("解决异常情况[%d]\n",value);
 27                                  break;
 28
 29                         default:
 30
 31                                  break;
 32                 }
 33         }
 34 }
 35 void exception()
 36 {
 37         int _err_no;
 38         if(_err_no=3){
 39                 printf("出现异常情况[%d]\n",_err_no);
 40                 longjmp(jumper,_err_no);
 41         }
 42         return;
 43 }
结果:
出现异常情况[3]
解决异常情况[3]
 1 #include
 2 #include
 3
 4 static jmp_buf buf;
 5 int main()
 6 {
 7    int b;
 8    b = 3;
 9
10     if (setjmp(buf) != 0)
11      {
12         printf("b=%d\n", b);
13         return 0;
14      }
15     b = 5;
16     longjmp(buf, 1);
17
18     return 0;
19 }
setjmp执行时返回0,执行b=5,调用longjmp(buf,1),跳转到setjmp(buf)调用,setjmp(buf)返回1,处打印b=5
 
阅读(702) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~