setjmp 或 longjmp 子例程

用途

保存并复原当前执行上下文。

标准 C 库 (libc.a)

语法

#include <setjmp.h>
int setjmp (Context)
jmp_buf Context;
void longjmp ( Context,  Value)
jmp_buf Context;
int Value;
int _setjmp (Context)
jmp_buf Context;
void _longjmp (Context, Value)
jmp_buf Context;
int Value;

描述

当处理程序的低级子例程中迂到的错误和中断时, setjmp 子例程和 longjmp 子例程很有用。

setjmp 子例程将当前堆栈上下文和信号掩码保存在由 Context 参数指定的缓冲区中。

longjmp 子例程将 setjmp 子例程保存的堆栈上下文和信号掩码复原到相应的 Context 缓冲区中。 在 longjmp 子例程运行之后,程序执行继续,就像对 setjmp 子例程的相应调用刚刚返回了 Value 参数的值一样。 在完成 longjmp 子例程之前,调用 setjmp 子例程的子例程不得返回。 setjmp longjmp 子例程保存并恢复信号掩码 sigmask (2)。_setjmp_longjmp 仅处理堆栈上下文。

If a process is using the AT&T System V 西格集 interface, then the 塞杰普 and 朗杰普 subroutines do not save and restore the signal mask. 在这种情况下,它们的操作与 _setjmp_longjmp 子例程的操作相同。

参数

描述
上下文 指定 jmp_buf 结构的地址。
VALUE 指示任何整数值。

返回值

setjmp 子例程返回值 0 ,除非返回来自对 longjmp 函数的调用,在这种情况下, setjmp 返回非零值。

longjmp 子例程不能将 0 返回到先前的上下文。 保留值 0 以指示首次由程序调用时 setjmp 子例程的实际返回。 longjmp 子例程不会从调用它的位置返回,而是继续执行程序,就像返回了返回值 Valuesetjmp 的相应调用一样。

如果向 longjmp 子例程传递了 0 的 Value 参数,那么执行将继续,就像对 setjmp 子例程的相应调用返回了值 1 一样。 在调用 longjmp 子例程时,所有可访问数据都具有值。

注意: 如果使用先前未由 setjmp 子例程设置的 Context 参数调用 longjmp 子例程, 或者如果对 setjmp 子例程进行相应调用的子例程已返回,那么 longjmp 子例程的结果未定义。 如果 longjmp 子例程检测到这样的情况,那么它会调用 longjmperror 例程。 如果 longjmperror 返回,那么程序将异常中止。 缺省版本的 longjmperror 打印消息: longjmp or siglongjmp used outside of saved context到标准错误并返回。 希望以其他方式退出的用户可以编写自己版本的 longjmperror 程序。