setjmp()和longjmp()--c的非本地跳轉

函數原型

//函數原型
#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的非零返回值指明瞭錯誤類型,隨後可以被解碼,並且在代碼的某個位置進行處理。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章