setjmp and longjmp
来源:互联网 发布:暖气片安装 知乎 编辑:程序博客网 时间:2024/05/29 08:41
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 longjmpvoid 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。
0 0
- setjmp and longjmp
- setjmp() and longjmp()
- setjmp and longjmp
- setjmp AND longjmp
- setjmp and longjmp
- setjmp longjmp
- setjmp()/longjmp()
- setjmp longjmp
- setjmp longjmp
- setjmp longjmp
- setjmp/longjmp
- setjmp/longjmp
- setjmp&longjmp
- setjmp\longjmp
- setjmp longjmp
- setjmp & longjmp
- setjmp&longjmp
- setjmp/longjmp
- iOS-上架APP之启动页设置(新手必看!)
- DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)
- Java面试之GC(垃圾收集器)
- Java如何操作Android的adb shell 之 我自己在程序中的使用方法
- PAT 1065
- setjmp and longjmp
- HTTP协议中,GET方法与POST方法比较
- 使用FMDB进行数据库操作
- UML2.0类关系基本概念与StarUML2操作
- sizeof与strlen的区别
- iOS XMPP开发环境的初步搭建
- php内核探索之变量Zval(1)
- android中MVP的理解和实例
- uvaoj-1595:symmetry