setjmp and longjmp
2016-02-25 20:21
260 查看
setjmp, sigsetjmp - save stack context for nonlocal goto
1.作用
C中我们不能goto一个其他函数离得
label,我们必须使用
setjmp和
longimp来完成这种类型的
branching
2.stack frame
每个function中的自动变量都保存在stack frame中
系统内部并有没有支持
stack的硬件,C的实现可能会使用链表来实现
stack frames
3.example:多层嵌套的程序
问题:如果内部深层次的函数出现了错误,会一层层返回。而使用
setjmp和
longjmp能解决这个问题。
5.原型
#include <setjmp.h> int setjmp(jmp_buf env); //Returns: 0 if called directly, nonzero if returning from a call to longjmp void longjmp(jmp_buf env, int val);
setjmp的参数
env是特殊的能保存所有值的数组。
setjmp第一次返回0,之后调用
longjmp后,会返回
longjmp的
val值。
下图是调用
longjmp后的
stack frames
6. automatic,register and volatile variables
值是否回退取决于具体的实现在完全优化的情况下:
如果不希望变量值回退(roll back)到第一次调用
setjmp之前的值,需要加上
volatile或者是
static变量
为register变量和auntomatic变量会回退到调用
setjmp之前的值
举例说明
例如自动变量 int a = 10,在调用setjmp之后的一段时间里a的值变成了66。后来出现错误调用了
longjmp,这时候从
setjmp处返回。此时a的值回退为之前的10。如果a为
volatile变量,那么值仍然为66。
相关文章推荐
- OPenCV学习09
- Java如何操作Android的adb shell
- 学习JavaMail
- 单词统计(未完成)
- Deep Neural Network
- Web Service中的几个重要术语
- 循环语句练习题
- AVL树(平衡二叉树)
- codeforces625BWar of the Corporations
- 360doc内文章复制保存方法
- 谈乔布斯艺术家情怀的魅力
- ubuntu离线安装mysql
- 百度基础架构部-分布式存储组面试经历
- Android Studio 安装教程
- php如何实现验证码
- 约会(并查集)
- Linux用rename给文件批量加后缀
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- 使用FormData,进行Ajax请求并上传文件
- shu_1186 字符排列问题