lwbaptx

setjmp和longjmp的用法

我们知道可以用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
2
val is 0
val is 1