setjmp longjump一些注意点及使用方法

jmp_buf结构体的定义

#define _JBLEN  9
typedef struct { int _jb[_JBLEN + 1]; } jmp_buf[1];

int a()

{

  jmp_buf env;

  if(setjmp(env) != 0) {exit(0);} //若是异常跳到此,则退出

  longjmp(env, 5); //异常跳转,错误码5

}

setjmp(env) 后,env保存的是当前函数a的堆栈地址信息(存在寄存器中)(栈顶指向地址,计数器等),

若此时a没返回,调用了longjmp(env, ret),则寄存器中的数据恢复成env里保存的地址等,相当于程序又退回到setjmp处去运行了

但是栈里的数据还是运行longjmp时的状态,并且会设置setjmp的返回值为ret,此时可以根据ret的值进行switch错误处理(=0是第一次正常运行)。

但是如果是在函数a return后,再调用b函数,b函数内执行longjmp(env, ret),此时是不对的,容易出现段错误。因为env中存的运行时寄存器状态(地址,计数器等)是针对a的栈环境有效,在b函数的栈里可能就是一些无效的值,所以不能这么写。

所以用这2个接口要注意:1.先setjmp再longjmp  2.longjmp的位置必须在setjmp的有效范围内(不能在setjmp所在函数a外,但可以在a里面调用的函数b里)

C++中伪代码

try

  xxxx

    throw(xx)

xxxx

catch

  switch 处理错误码等

end

C里面用setjmp实现类似try catch功能

#include <setjmp.h>

....

jmp_buf env;

switch(setjmp(env)){

  case 0:

    xxxx

      if 出现异常 {longjump(env, 分类处理的错误码);}

    xxxx

    break;

  case 某个错误码:

    错误处理

    break;

  default:

    break;

}

....

另:《unix环境高级编程》7.10小节有对这个函数的讲解

【原创】setjmp longjump一些注意点及使用方法的更多相关文章

  1. 【原创】内核ShellCode注入的一种方法

    标 题: [原创]内核ShellCode注入的一种方法 作 者: organic 时 间: 2013-05-04,04:34:08 链 接: http://bbs.pediy.com/showthre ...

  2. 原创博客>>>解决粘包问题的方法

    目录 原创博客>>>解决粘包问题的方法 原创博客>>>解决粘包问题的方法 服务端: import socket import struct service=sock ...

  3. [原创]快速指定SQLDeveloper所使用JDK的方法

    就众多的免费SQL开发工具来讲,Oracle出品的SQLDeveloper 还是一个很不错的选择. 看到网上不少的帖子讨论SQL Developer 启动的时候报告找不到Java Home(或JDK) ...

  4. 【原创】XAF 常见错误以及对应解决方法

    1.Appearance Criteria设置错误 Exception occurs while assigning the 'DetailView, ID:xxx_DetailView' view ...

  5. 【Vegas原创】SQL Server 只安装客户端的方法

    只安装管理工具

  6. 【原创】手动导入SQLServer数据到SQLCE方法

    我找到一个工具,可以很容易把SQLServer里的数据导入到SQLCE: 工具名:Export2SqlCe.exe, 下载路径: http://exportsqlce.codeplex.com/rel ...

  7. (原创)Hibernate persistentSet的remove()方法不起作用

    情景再现:hibernate 多对多  User对象(员工).Educate对象(培训课程),我想干的事情是想把第三方表格user_educate中的员工_培训课程中的一行信息删掉(删掉员工所选的一门 ...

  8. [原创]Java中使用File类的list方法获取一定数量的文件:FilenameFilter接口的特殊用法

    前言:有时候我们可能会遇到这样一个问题:需要遍历一个包含极多文件的文件夹,首先想到的肯定是使用File.list()方法,该方法返回一个String[],但是如果文件达到几亿呢?这个时候我们就需要分批 ...

  9. [原创]aaencode等类似js加密方案破解方法

    受http://tieba.baidu.com/p/4104806767 2L启发,不过他说的方法,我没有尝试成功,自己摸索出了一个新方法,在这里分享下. 首先拿aaencode官网的加密字符串作为例 ...

随机推荐

  1. 团体程序设计天梯赛-练习集L1-004. 计算摄氏温度

    L1-004. 计算摄氏温度 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈建海 给定一个华氏温度F,本题要求编写程序,计算对应的 ...

  2. (转)struts2.0配置文件、常量配置详解

    一.配置: 在struts2中配置常量的方式有三种: 在struts.xml文件中配置 在web.xml文件中配置 在sturts.propreties文件中配置 1.之所以使用struts.prop ...

  3. "Principles of Reactive Programming" 之<Actors are Distributed> (3)

    Cluster 讲课的这哥们接下来讲了下Akka Cluster的使用,但是是通过把一个以前讲过的actor 系统改成使用cluster来介绍的Akka cluster. 这部分代码很多,还是直接看视 ...

  4. scala学习-类与对象

    类 / 对象 [<快学Scala>笔记] 一.类 1.Scala中的类是公有可见性的,且多个类可以包含在同一个源文件中: class Counter{ private var value ...

  5. Head First 设计模式笔记:单例模式

    单例模式 确保一个类只有一个实例,并提供一个全局访问点. 类图: Singleton static uniqueInstance //其他属性... static getInstance() //其他 ...

  6. pogo pin连接器塑胶部件的缺陷及产生原因分析

    pogo pin连接器塑胶部件异色.褪色产品的颜色与标准颜色不同的现象.与树脂颜色不同为异色:注塑后颜色发生改变的现象为变色. 产生的主要原因:1.着色错误(色粉有误) 2.树脂污染3.过多使用粉碎品 ...

  7. Apache James搭建内网邮件服务器

    Apache James搭建内网邮件服务器 极客521 | 极客521 2014-08-21 148 阅读 java 大概之前两个礼拜的日子,讨论会介绍了关于了.net内网邮件服务器的搭建.所以自己也 ...

  8. 深入研究Java类加载机制

    类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性 ...

  9. android开发无障碍app

    最近做一些为盲人提供服务的APP,还是挺有感触的,感谢手机和互联网的普及,他们的生活比以前丰富了很多. 通过读屏软件,盲人可以操作手机,上网浏览信息.读屏软件的工作原理很简单,就是读出屏幕上按钮.文本 ...

  10. 对于eclipse新建maven工程需要注意的地方。

    新建项目的时候,如果想配置默认的maven的jre为1.6或者别的. http://hi.baidu.com/hi_hi/item/765ec8bbc49880d384dd79d1 1.cmd命令建立 ...