longjmp ()- 還原堆疊環境
格式
#include <setjmp.h>
void longjmp(jmp_buf env, int value);語言層次
ANSI
安全執行緒
是
說明
longjmp() 函數會還原先前由 setjmp() 函數儲存在 env 中的堆疊環境。 setjmp() 及 longjmp() 函數提供一種執行非本端 goto的方法。 它們通常用於信號處理程式。
對 setjmp() 函數的呼叫會導致現行堆疊環境儲存在 env中。 後續呼叫 longjmp() 會還原已儲存的環境,並將控制權傳回給程式中對應於 setjmp() 呼叫的某個點。 處理程序會回復,如同 setjmp() 呼叫剛傳回給定的 值一樣。
所有可供接收控制項的函數使用的變數 (除了暫存器變數之外) ,都包含它們在呼叫
longjmp() 時所擁有的值。 無法預期登錄變數的值。 在對 setjmp() 和 longjmp() 函數的呼叫之間變更的永久 auto 變數也無法預期。附註: 在呼叫對應的
longjmp() 函數之前,請確定呼叫 setjmp() 函數的函數未傳回。 在呼叫 setjmp() 函數的函數之後呼叫 longjmp() 會導致無法預期的程式行為。value 引數必須為非零。 如果您為 值提供零引數, longjmp() 會在其位置替換 1 。
回覆值
longjmp() 函數不使用一般函數呼叫及傳回機制; 它沒有回覆值。
範例
此範例會將堆疊環境儲存在陳述式中:
if (setjmp(mark) != 0) ...
當系統第一次執行 if 陳述式時,它會將環境儲存在 標示 中,並將條件設為 FALSE ,因為
setjmp() 函數在儲存環境時傳回 0。 程式會列印下列訊息: setjmp has been called
函數 p() 的後續呼叫會導致它呼叫 longjmp() 函數。 在使用 mark 變數中儲存的環境呼叫 setjmp() 函數之後,控制項會立即轉移至 main() 函數中的點。 此時,條件為 TRUE ,因為在 longjmp() 函數呼叫的第二個參數中指定 -1 作為要放置在堆疊上的回覆值。 然後,此範例會執行區塊中的陳述式,列印訊息「longjmp() 已呼叫」,呼叫 recover() 函數,並離開程式。
#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>
jmp_buf mark;
void p(void);
void recover(void);
int main(void)
{
if (setjmp(mark) != 0)
{
printf("longjmp has been called\n");
recover();
exit(1);
}
printf("setjmp has been called\n");
printf("Calling function p()\n");
p();
printf("This point should never be reached\n");
}
void p(void)
{
printf("Calling longjmp() from inside function p()\n");
longjmp(mark, -1);
printf("This point should never be reached\n");
}
void recover(void)
{
printf("Performing function recover()\n");
}
/*******************Output should be as follows: **********************
setjmp has been called
Calling function p()
Calling longjmp() from inside function p()
longjmp has been called
Performing function recover()
**********************************************************************/