您的位置:首页 > 其它

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: