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()
**********************************************************************/

相關資訊