全局跳转
UNIX 下的C 语言中, 有一对特殊的调用: 跳转函数, 原型如下:
#include <setjmp.h>
int setjmp(jmp_buf env);
void longjump(jmp_buf env, int val);
函数setjmp 存储当前的堆栈环境(包括程序的当前执行位置)到参数env 中, 当函数正常调用成功时返回
0. 函数longjmp 恢复保存在env 中堆栈信息, 并使程序转移到env 中保存的位置处重新执行. 这两个函数
联合使用, 可以实现程序的重复执行.
函数longjmp 调用成功后, 程序转移到函数setjmp 处执行, 函数 setjmp 返回val. 如果参数 val的取值
为0, 为了与上次正常调用 setjmp 相区别, 函数setjmp 将自动返回1.
下面是一个使用了跳转语句的例子, 它跳转两次后退出.
[bill@billstone Unix_study]$ cat jmp1.c
#include <setjmp.h>
int j = 0;
jmp_buf env;
int main()
{
auto int i, k = 0;
i = setjmp(env);
printf("setjmp = [%d], j = [%d], k = [%d]\n", i, j++, k++);
if(j > 2)
exit(0);
sleep(1);
longjmp(env, 1);
return 0;
}