setjmp和longjmp


头文件<setjmp.h>中的声明提供了一种不同于通常的函数调用和返回顺序的方式,特别是,它允许立即从一个
深层嵌套的函数调用中返回。
int setjmp(jmp_buf env)
setjmp 宏将状态信息保存到 env 中,供 longjmp 使用。如果直接调用 setjmp,则返回值为 0;如果是在
longjmp 中调用 setjmp,则返回值为非 0。setjmp 只是用于某些上下文中,如用于 if 语句,switch 语句、循环语
句的条件测试中及一些简单的关系表达式中。例如:
if(setjmp(env) == 0)
/* 直接调用 setjmp 时,转移到这里 */
else
/* 调用 longjmp 时,转移到这里 */

void longjmp(jmp_buf env, int val)
longjmp 通过最近一次调用 setjmp 时保存到 env 中的信息恢复状态,同时,程序重新恢复执行,其状态等同于
setjmp 宏调用刚刚执行完并返回非 0 值 val。包含 setjmp 宏调用的函数的执行必须还没有终止。除下列情况外,
可访问对象的值同调用 longjmp 时的值相同;在调用 setjmp 宏后,如果调用 setjmp 宏的函数中的非 volatile 自
动变量改变了,则它们将变成未定义状态。

有一种比较简单的理解方式,当收到一个要进行睡眠信号时,使用setjmp会把上下文信息保存在堆栈中(内存中),然后去睡眠,当再次收到运行信号时,用longjmp可以把这个进程的状态信息替换成setjmp保存的信息.然后再运行.longjmp无返回值,因为他使用以后会自动跳转到setjmp的保存地址中然后恢复堆栈命令开始执行.

原文地址:https://www.cnblogs.com/notepi/p/2875961.html