在 C 标准库中,有两个威力很猛的函数:setjmp 和 longjmp,不知道各位小伙伴在代码中是否使用过?我问了身体的几位同事,一部分人不认识这两个函数,有一部分人知道这个函数,但从来没有使用过。
从知识点范围来看,这两个函数的功能比较单纯,一个简单的示例代码就能说清楚了。但是,我们需要从这个知识点进行发散、思考,在不同的维度上,把这个知识点与这个编程语言中其它类似的知识进行联想、对比;与其他编程语言中类似的概念进行比较;然后再思考这个知识点可以使用在哪些场合,别人是怎么来使用它的。
今天,我们就来掰扯掰扯这两个函数。虽然在一般的程序中使用不上,但是在今后的某个场合,当你需要处理一些比较奇特的程序流程时,也许它们可以给你带来意想不到的效果。
例如:我们会把 setjmp/longjmp 与 goto 语句进行功能上的比较;与 fork 函数从返回值上进行类比;与 Python/Lua 语言中的协程进行使用场景上的比较。
二、函数语法介绍
1. 最简示例
先不讲道理,直接看一下这个最简单的示例代码,看不懂也没关系,混个脸熟:
int main()
{
// 一个缓冲区,用来暂存环境变量
jmp_buf buf;
printf("line1 \n");
// 保存此刻的上下文信息
int ret = setjmp(buf);
printf("ret = %d \n", ret);
// 检查返回值类型
if (0 == ret)
{
// 返回值0:说明是正常的函数调用返回
printf("line2 \n");
// 主动跳转到 setjmp 那条语句处
longjmp(buf, 1);
}
else
{
// 返回值非0:说明是从远程跳转过来的
printf("line3 \n");
}
printf("line4 \n");
return 0;