加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

利用C语言 中的Setjmp 和Longjmp,来完善异常捕获和协程

发布时间:2022-12-06 12:35:45 所属栏目:语言 来源:
导读:在 C 标准库中,有两个威力很猛的函数:setjmp 和 longjmp,不知道各位小伙伴在代码中是否使用过?我问了身体的几位同事,一部分人不认识这两个函数,有一部分人知道这个函数,但从来没有使用过。

从知识点范围

在 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;
 

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!