首页
学习
活动
专区
工具
TVP
发布

C语言异常处理之 setjmp()和longjmp()

其实可以通过setjmp()和longjmp()配合使用 描述 和goto很相似, 但是可以从一个函数到另外一个函数的跳转,常常用在异常处理上面....这两个函数需要正确使用,否则会破坏程序顺序执行方式 头文件 #include setjmp()和longjmp() int setjmp(jmp_buf env); 将当前上下文保存在...,所以会从setjmp函数调用点返回,返回值为val 跳转机制 (以 mian()函数 和 divide()函数 为例): mian()函数 调用了 setjmp(env) ,将上下文(入栈)保存在env...进入 setjmp()函数 后,由于发现除法为0,所以使用 longjmp(env,1)函数 ,恢复 setjmp() 保存的上下文,也就是直接返回到了 main()函数 处理 setjmp(env)...); //手动调用 setjmp(),将返回正常值(0),    if(!

97340
您找到你想要的搜索结果了吗?
是的
没有找到

掀起你的汇编来:如何移植ST协程到其他系统或CPU?

其实,移植ST比想象的要简单很多,最关键的就是实现setjmp/longjmp,也就是保存寄存器和恢复寄存器,所以步骤如下: 1.分析你的平台的寄存器使用,也就是函数调用规范。...Linux arm Stable make linux-debug For ARM(v7) device, #1[4] Linux aarch64 Stable make linux-debug For...-_st_md_cxt_restore #endif Note: 实际上,_st_md_cxt_save就是setjmp,而_st_md_cxt_restore就是longjmp。...最后,就是用汇编实现函数,需要找下平台相关的资料(也可以直接通过调试setjmp和longjmp的实现,来学习如何将寄存器保存到jmpbuf,以及如何从jmpbuf恢复),详细参考 #21[13]。...Note: 创建协程时,当时的SP可能是在另外一个协程,所以创建的协程并不能直接使用当前的SP,而需要从堆上重新申请虚拟的stack,所以在setjmp后需要更新jmpbuf中的SP地址。

63230

利用C语言中的setjmp和longjmp,来实现异常捕获和协程

setjmp/longjmp 实现协程 五、总结 一、前言 在 C 标准库中,有两个威力很猛的函数:setjmp 和 longjmp,不知道各位小伙伴在代码中是否使用过?...函数说明 首先来看下这个 2 个函数的签名: int setjmp(jmp_buf env); void longjmp(jmp_buf env, int value); 它们都在头文件 setjmp.h...但是如果看一下 Linux 内核的代码,可以发现很多的 goto 语句。还是那句话:在代码维护和执行效率上要寻找一个平衡点。...类似的,setjmp 函数也有不同的返回类型。...也许用返回类型来表述不太准确,可以这样理解:从 setjmp 函数返回,一共有 2 个场景: 主动调用 setjmp 时:返回 0,主动调用的目的是为了保存上下文,建立快照。

1.8K10

小白学协程笔记2-c语言实现协程-2021-2-10

文章目录 前言 一、c语言中协程切换方式 二、使用setjmp 和 longjmp实现协程切换 1.setjmp和longjmp函数简介 2.协程实现 三、使用switch-case实现协程切换 1...二、使用setjmp 和 longjmp实现协程切换 1.setjmp和longjmp函数简介 setjmp和longjmp是C99标准中文件里定义的两个函数,定义如下: int setjmp...b.longjmp函数负责跳转到参数 env 中保存的上下文中去执行setjmp函数,并且返回值是longjmp的第二个参数val。...setjmp负责将这些寄存器信息保存到env参数,longjmp跳转时就可以根据保存的env参数重置cpu寄存器的值,从而跳转到指定位置开始执行程序。...2.协程实现 使用setjmp和longjmp简单实现的一个协程切换函数如下所示: #include #include #include /*

1.1K20

思科VPP系列专题十:协程模型

协程有多种语言的实现方式,对于C语言来说,C标准库里有“非局部跳转”函数setjmp和longjmp,它们分别保存和恢复:栈指针、程序计数器、被调用者保存的寄存器和ABI要求的任何其他内部状态。...VPP协程模型 VPP的协程便是由setjmp/longjmp实现。...使用longjmp/setjmp的轻量级多任务协程,由应用进程自行进行调度,不受操作系统调度机制的影响,上下文切换只损耗调用longjmp/setjmp的时间。.... */ 跳转到setjmp设置点,reurn_value 就是跳转到clib—setjmp返回数值 void clib_longjmp (clib_longjmp_t * save, uword return_value...; otherwise returns value from clib_longjmp if long jump is taken. */ 设置跳转返回点,默认返回 uword clib_setjmp

20710

协程(coroutine)简介

虽然很多操作系统(比如 Linux)进程与线程区别不是非常明显,但线程还是比进程要轻 Linux 线程切换耗时分析 线程的切换(Context Switch)相比于其他操作而言并不是非常耗时,如下图所示...(2018年): 参考这篇介绍Linux线程相关文章,Linux 2.6 之后 Linux 多线程的性能提高了很多,大部分场景下线程切换耗时在 2us 左右。...下面是 Linux 下线程切换耗时统计(2013 年) 正常情况下线程有用的 CPU 时间片都在数十毫秒级别,线程切换占总耗时的千分之几以内。...C++20 引入的是无栈协程 使用 setjmp/longjmp 实现的简单协程 下面代码模拟了单线程并发执行两个 while(true){...}...函数,细节可以查看原始 文档 和 代码 setjmp/longjmp 不能作为协程实现的底层机制,因为 setjmp/longjmp 对栈信息的支持有限 int max_iteration = 9; int

79820
领券