我们知道可以用goto来实现函数内的跳转,setjmp和longjmp则是用于实现函数外的跳转。
因此可以用setjmp和longjmp来实现C的异常处理或者用于实现协程。
statethreads这个协程库就是基于setjmp和longjmp实现的
setjmp把当前函数的调用环境保存到env中
第一次设置会返回0
当longjmp跳转的时候,会返回longjmp的第二个参数int setjmp (jmp_buf env);
longjmp在当前位置跳转到之前保存的env的环境中void longjmp (jmp_buf env, int val);
来看一个例子1
2
3
4
5
6
7
8
9
10
11
12#include <stdio.h>
#include <setjmp.h>
int main() {
jmp_buf env;
int val;
val=setjmp(env);
printf ("val is %d\n",val);
if (!val)
longjmp(env, 1);
return 0;
}
输出的结果1
2val is 0
val is 1