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。