函數原型
//函數原型
#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);
}