setjmp 或 longjmp 子例程
用途
保存并复原当前执行上下文。
库
标准 C 库 (libc.a)
语法
描述
当处理程序的低级子例程中迂到的错误和中断时, 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 子例程不会从调用它的位置返回,而是继续执行程序,就像返回了返回值 Value的 setjmp 的相应调用一样。
如果向 longjmp 子例程传递了 0 的 Value 参数,那么执行将继续,就像对 setjmp 子例程的相应调用返回了值 1 一样。 在调用 longjmp 子例程时,所有可访问数据都具有值。