加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

发布时间:2021-06-02 23:37:00 所属栏目:编程 来源:互联网
导读:在 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; 

(编辑:PHP编程网 - 湛江站长网)

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