C 语言中 setjmp 和 longjmp( 三 )

如果你读过 Linux 操作系统进程切换的源码 , 你会很明白 Linux 会把进程的上下文保存在 task_struct 结构体中 , 切换时直接恢复 。 这里我们也可以这样做 , 将 Label 处的函数上下文保存在某个结构体中 , 但执行到 GOTO Label 语句时 , 我们从该结构体中恢复函数的上下文 。

这就是函数间进行跳转的基本原理 , 而 C 语言中 setjmp 和 longjmp 就为我们完成了这样的保存上下文和切换上下文的工作 。

函数原型

#include <setjmp.h>

intsetjmp(jmp_bufenv);

setjmp 函数的功能是将函数在此处的上下文保存在 jmp_buf 结构体中 , 以供 longjmp 从此结构体中恢复 。

参数 env 即为保存上下文的 jmp_buf 结构体变量;

如果直接调用该函数 , 返回值为 0;若该函数从 longjmp 调用返回 , 返回值为非零 , 由 longjmp 函数提供 。 根据函数的返回值 , 我们就可以知道 setjmp 函数调用是第一次直接调用 , 还是由其它地方跳转过来的 。

推荐阅读