setjmp, sigsetjmp - save stack context for nonlocal goto

1.作用

C中我们不能goto一个其他函数离得label,我们必须使用setjmplongimp来完成这种类型的branching

2.stack frame

每个function中的自动变量都保存在stack frame

系统内部并有没有支持stack的硬件,C的实现可能会使用链表来实现stack frames

3.example:多层嵌套的程序


问题:如果内部深层次的函数出现了错误,会一层层返回。而使用setjmplongjmp能解决这个问题。

5.原型

#include <setjmp.h>int setjmp(jmp_buf env);
//Returns: 0 if called directly, nonzero if returning from a call to longjmpvoid longjmp(jmp_buf env, int val);

setjmp的参数env是特殊的能保存所有值的数组。setjmp第一次返回0,之后调用longjmp后,会返回longjmpval值。

下图是调用longjmp后的stack frames

6. automatic,register and volatile variables

值是否回退取决于具体的实现

在完全优化的情况下:
如果不希望变量值回退(roll back)到第一次调用setjmp之前的值,需要加上volatile或者是static变量

为register变量和auntomatic变量会回退到调用setjmp之前的值

举例说明

例如自动变量 int a = 10,在调用setjmp之后的一段时间里a的值变成了66。后来出现错误调用了longjmp,这时候从setjmp处返回。此时a的值回退为之前的10。如果a为volatile变量,那么值仍然为66。

setjmp and longjmp相关推荐

  1. Linux学习之setjmp和longjmp函数

    nsetjmp和longjmp函数实现函数之间的跳转(需包含头文件"setjmp.h"): 函数原型:int setjmp(jmp_buf env);   void longjmp ...

  2. 递归和函数栈与setjmp和longjmp的关系

    递归每执行一次都会释放一次函数栈 setjmp 记录函数栈的栈顶 longjmp 寻找函数栈的栈顶 如果longjmp找到了他要寻找的函数栈顶 调用setjmp的函数栈不会被释放 所以setjmp 和 ...

  3. setjmp()、longjmp() Linux Exception Handling/Error Handling、no-local goto

    目录 1. 应用场景 2. Use Case Code Analysis 3. 和setjmp.longjmp有关的glibc and eglibc 2.5, 2.7, 2.13 - Buffer O ...

  4. C异常处理实现: setjmp和longjmp

    此文为internet上选摘,过后我会用自己的理解补充此文. ------------ 将对setjmp与longjmp的具体使用方法和适用的场合,进行一个非常全面的阐述. 另外请特别注意,setjm ...

  5. 【转】浅析C语言的非局部跳转:setjmp和longjmp

    转自 http://www.cnblogs.com/lienhua34/archive/2012/04/22/2464859.html C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转 ...

  6. 不同函数之间的跳转setjmp和longjmp

    我们学过C语言中的goto,只能当前函数里面跳转是不能跨越函数的.setjmp和longjmp却可以跨越函数跳转. #include <stdio.h> #include <setj ...

  7. [转]全面了解setjmp与longjmp的使用

                          将对setjmp与longjmp的具体使用方法和适用的场合,进行一个非常全面的阐述. 另外请特别注意,setjmp函数与longjmp函数总是组合起来使用, ...

  8. C异常处理机制:setjmp和longjmp

    setjmp()和longjum()是通过操纵过程活动记录实现的.它是C语言所独有的.它们部分你不了C语言有限的转移能力.这个两个函数协同工作,如下所示:     *setjmp(jmp_buf j) ...

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

    一.前言 二.函数语法介绍 与 goto 语句比较 与 fork 函数比较 与 Python 语言中的 yield/resume 比较 三.利用 setjmp/longjmp 实现异常捕获 四.利用 ...

  10. linux C下的setjmp与longjmp介绍

    setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理. 先来看一下这两个函数的定义 ...

最新文章

  1. C中memcpy使用注意事项
  2. 并查集与贪心算法的应用之求解无向图的最小生成树
  3. linux用什么剪辑视频教程,Linux 上的开源视频剪辑软件Olive
  4. 【BZOJ4199】品酒大会,后缀数组+并查集维护
  5. 【❤️万字长文总结❤️】一篇学会Redis高可用✔集群✔搭建详细教程
  6. radius服务器认证系统,TekRadius(RADIUS服务器)
  7. 电脑用上这些壁纸站与软件,惊艳你的眼球!
  8. STM32F412 can测试问题汇总
  9. 基于区块链的数字藏品管控方案
  10. Kingbase8开发版,启动提示FATAL: XX000: max_connections should be less than orequal than 10
  11. 计算机网络——CSMA协议
  12. 电脑虚拟服务器云主机运维论坛,虚拟服务器云主机论坛
  13. 想转行程序员,参加java培训班真的有用吗?
  14. 使用 NodeBB 搭建的中文社区索引
  15. R 计算数据框多个变量频次表
  16. Java编程思想读书笔记——多态
  17. JS与CSS交互及JavaScript 特效之四大家族
  18. Java语言进阶-List、Set、数据结构、Collections
  19. signature=b0e0b3f7d0e5b4c008c798d95174dc8e,高清剧场
  20. 网上阅卷源码有要的吗

热门文章

  1. 2020年阿里云双11活动官网地址入口
  2. 分类信息 - 网址大全
  3. 平均数,中位数和众数
  4. 印度加速量子计算布局,推出国内首个量子计算机模拟器工具包
  5. GB28181国标协议通讯流程简析以及NVR注册不上等相关问题点记录
  6. c#+AE开发中,System.Windows.Forms.AxHost.InvalidActiveXStateException 在 ESRI.ArcGIS.AxControls.dll 中发生
  7. PHP设计模式之一:观察者模式
  8. 【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + 万集716 单线激光 测试
  9. windows - 屏幕抓取技术总结
  10. datastage连接mysql库_DataStage8.7连接远程Oracle数据库