函数原型
//函数原型
#include
int setjmp(jmp_buf env);
int longjmp(jmp_buf env,int retval);
setjmp 函数在evn 缓冲区中保存当前调用环境,供后面的longjmp 使用。evn 中保存了程序计数器,栈指针和寄存器中的内容。
longjmp 函数从evn 中恢复调用环境,触发最近一次初始化env 的setjmp 的返回,setjmp 返回并带有返回值retval。
setjmp 函数只被调用一次,但是返回多次:第一次调用setjmp 初始化保存调用环境的缓冲区env,并返回0;被相应的longjmp调用
触发,并返回retval。
示例:
#include "stdio.h"
#include "stdlib.h"
#include "setjmp.h"
#include "signal.h"
jmp_buf buf;
int error1 = 0;
int error2 = 1;
void foo(void),bar(void);
int main()
{
int rc;
rc = setjmp(buf);
if (rc == 0)
foo();
else if (rc == 1)
printf("Detected an error1 condition in foo\n");
else if (rc == 2)
printf("Detected an error2 condition in foo\n");
else
printf("Unknown error condition in foo\n");
exit(0);
}
void foo(void)
{
if (error1)
longjmp(buf, 1);
bar();
}
void bar(void)
{
if (error2)
longjmp(buf, 2);
}
main 函数首先调用setjmp 以保存当前的调用环境,然后调用foo,foo再调用bar。如果foo 或bar 遇到一个错误,它们立刻通过一次longjmp 调用
从setjmp 返回。setjmp的非零返回值指明了错误类型,随后可以被解码,并且在代码的某个位置进行处理。