Chinaunix首页 | 论坛 | 博客
  • 博客访问: 306260
  • 博文数量: 33
  • 博客积分: 132
  • 博客等级: 入伍新兵
  • 技术积分: 1002
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-16 22:24
个人简介

学习计算机科学与技术专业,喜欢计算机,喜欢linux,喜欢编程

文章存档

2014年(7)

2013年(12)

2012年(14)

分类: C/C++

2013-05-29 23:55:03

函数原型  int setjmp(jmp_buf envbuf)

setjmp函数用缓冲区envbuf保存系统堆栈的内容,以便后续的longjmp函数使用。setjmp函数初次启用时返回 0 值。

说到setjmp函数,就不得不说longjmp函数,这两个函数是搭配使用的。

函数原型  void longjmp(jmp_buf envbuf, int val)

longjmp函数的中参数envbuf是由setjmp函数所保存的堆栈环境、参数val设置setjmp函数的返回值。longjmp函数本

身是没有返回值的,它执行跳转到保存envbuf参数的setjmp函数调用,并由setjmp函数调用返回,此时setjmp函数的

返回值就是 val 。

通俗的说,先调用setjmp,用变量envbuf记录当前的位置,然后调用longjmp,返回envbuf所记录的位置,并使setjmp的

返回值为val。当时是longjmp时,envbuf的内容被销毁了。其实这里的“位置”的真正含义是栈顶指针。

总之,他们是通过操纵过程活动记录实现的。

这两个函数的最大用途在于错误处理。

1.setjmp(jmp_buf)必须首先被调用。它表示“使用变量 j 记录现在的位置。函数返回值为 0 ”。

2.longjmp(jmp_buf j, int i)可以接着被调用,它表示“回到 j 所记录的位置, 让它看上去像是

从原先的setjmp()函数返回一样。 但是函数返回 i, 使代码能够知道它实际上是通过longjmp()

返回的”。

3.当使用于longjmp()时,j 的内容被销毁。

setjmp保存了一份程序计数器和当前的栈顶指针。如果喜欢也可以保存一些初始值。

longjmp恢复这些值,有效地转移控制并把状态重置回保存状态的时候。因为你从堆栈中展开

过程活动记录,直到取得保存在其中的值,尽管longjmp会导致转移,但它和 goto 又有不同,

区别如下。

a.  goto语句不能跳出C语言当前的函数(但longjmp可以跳的很远,甚至可以跳到其他文件的函数中)。

b.  用longjmp只能跳回到曾经到过的地方,在执行setjmp的地方仍留有一个过程活动记录。longjmp

     接受一个额外的整形参数并返回它的值,这可以知道是由longjmp转移到这里的还是从一条语句执行

     后自然而然来到这里的。

点击(此处)折叠或打开

  1. #include <setjmp.h>
  2. jmp_buf buf;
  3. #include <setjmp.h>
  4. #include <stdio.h>
  5. void fun()
  6. {
  7.     printf("in fun()n");
  8.     longjmp(buf, 1);
  9.     /*这段代码不会被执行*/
  10.     printf("can't see");
  11. }
  12. int main()
  13. {
  14.     if(setjmp(buf))
  15.     {
  16.         printf("back in main()n");
  17.     }
  18.     else
  19.     {
  20.         printf("first time throughn");
  21.         fun();
  22.     }
  23.     return 0;
  24. }
执行结果的是:(我的系统是64位fedora 18系统,编译环境是gcc 4.7.2)


阅读(3405) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~