setjmp ()- 保留环境

格式

#include <setjmp.h>
int setjmp(jmp_buf env);

语言级别

ANSI

线程安全

描述

setjmp() 函数保存随后可由 longjmp() 函数复原的堆栈环境。 setjmp()longjmp() 函数提供了执行非本地 goto的方法。 它们通常用于信号处理程序。

setjmp() 函数的调用会使其在 env中保存当前堆栈环境。 对 longjmp() 函数的后续调用将复原保存的环境,并将控制权返回到对应于 setjmp() 调用的点。 可用于函数接收控件的所有变量 (寄存器变量除外) 的值包含调用 longjmp() 函数时它们具有的值。 寄存器变量的值不可预测。 在对 setjmp() 函数和 longjmp() 函数的调用之间更改的非易失性 auto 变量也不可预测。

返回值

setjmp() 函数在保存堆栈环境后返回值 0 。 如果 setjmp() 函数作为 longjmp() 调用的结果返回,那么它将返回 longjmp() 函数的 value 自变量,如果 longjmp() 函数的 value 自变量为 0,那么返回 1 。 没有错误返回值。

示例

此示例将堆栈环境保存在语句中:
   if (setjmp(mark) != 0) ...
当系统首次执行 if 语句时,它会将环境保存在 mark 中,并将条件设置为 FALSE ,因为 setjmp() 函数在保存环境时返回 0。 程序打印消息:
   setjmp has been called

对函数 p() 的后续调用会使其调用 longjmp() 函数。 在使用保存在 mark 变量中的环境调用 setjmp() 函数之后,控件将立即传输到 main() 函数中的点。 这次的条件是 TRUE ,因为 -1 在 longjmp() 函数调用的第二个参数中被指定为堆栈中的返回值。 然后,该示例执行块中的语句,打印消息 "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()
**********************************************************************/

相关信息