C語言中的setjmp和longjmp

2021-10-02 10:14:47 字數 942 閱讀 5093

在c語言中,goto語句只能在乙個函式內實現跳轉,而不能在函式間進行跳轉。如果希望在函式間跳轉,可以使用 setjmp 和 longjmp 函式。

linux 會把程序的上下文儲存在 task_struct 結構體中,切換時直接恢復。而 setjmp 和 longjmp 的原理也差不多: 第一次呼叫setjmp時,儲存該函式內的上下文;呼叫longjmp時,跳轉到setjmp處再呼叫setjmp來恢復此處的函式上下文。

函式原型:

#include

intsetjmp

(jmp_buf env)

;

setjmp 函式的功能是將函式在此處的上下文儲存在 jmp_buf 結構體中,以供 longjmp 從此結構體中恢復。

void

longjmp

(jmp_buf env,

int val)

;

longjmp 函式的功能:從jmp_buf結構體中恢復由setjmp函式儲存的上下文,該函式不返回,而是從setjmp函式返回。

即相當於呼叫了 longjmp 了之後,就跳轉到setjmp處,由setjmp進行返回。

程式示例

#include

#include

#include

static jmp_buf env;

void

call_setjmp()

}void

call_longjmp

(int val)

intmain()

程式輸出:

finished initialization of env

hit 10

hit 20

hit nothing useful

(完)

C語言中的setjmp和longjmp函式

c語言的setjmp 異常處理與構建協作式多工系統 int setjmp jmp buf envbuf 巨集函式setjmp 在緩衝區envbuf中儲存系統堆疊裡的內容,供longjmp 以後使用,setjmp 必須使用標頭檔案setjmp.h。呼叫setjmp 巨集時,返回值為0,然而longjm...

c語言中的setjmp和longjmp簡介

setjmp將當前程式的執行環境儲存在乙個jump buf型別的全域性變數中 因為後續要被longjmp呼叫 第一次呼叫setjmp的返回值是null 中後續的 中執行到longjmp以後,longjmp需要兩個引數,乙個是之前setjmp儲存到執行環境的全域性變數可以調整到setjmp函式 另乙個...

c語言中setjmp與longjmp(2)

如何實現異常處理 首先設定乙個跳轉點 setjmp 函式可以實現這一功能 然後在其後的 中任意地方呼叫 longjmp 跳轉回這個跳轉點上,以此來實現當發生異常時,轉到處理異常的程式上,在其後的介紹中將介紹如何實現。setjmp 為跳轉返回儲存現場並為異常提供處理程式,longjmp 則進行跳轉 丟...