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。
本文介绍了C语言中setjmp和longjmp函数的作用与用法,包括如何利用这两个函数实现跨函数的错误处理,以及它们对自动变量、寄存器变量和易变变量的影响。
3370

被折叠的 条评论
为什么被折叠?



