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. ACM题集以及各种总结大全!

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  2. spoj 665

    直接判  没什么算法  也没什么技巧  水水~~ #include <cstdio> #include <cstring> #include <algorithm> ...

  3. Akka官方文档翻译:Cluster Specification

    参加了CSDN的一个翻译项目,翻译Akka的文档.CSDN提供的翻译系统不好使,故先排版一下放在博客上. 5.1 集群规范 注意:本文档介绍了集群的设计理念.它分成两部分,第一部分描述了当前已经实现的 ...

  4. Host Definition

    Description: A host definition is used to define a physical server, workstation, device, etc. that r ...

  5. Redis-PHP-Hash 表相关API

    Hashes 相关 ================================ hDel - 删除一个哈希 key hExists - 检查哈希 key是否存在 hGet - 获得某哈希 key ...

  6. PHP开篇之环境的搭建

    PHP开篇之环境的搭建 Wamp软件下载:http://www.wampserver.com/ 此时是2.5版本 下载下来一键安装. 安装有个主意 这里先不用管 或者smtp@qq.com 13643 ...

  7. SaaS系列介绍之五: 我国SaaS市场分析

    1 我国SaaS市场现状 我国SaaS从ASP年代发展到今天,也有不少时间了.我国是个十几亿人的大国,国情复杂,各地贫富不均,发展不平衡.信息系统建设也是各树一帜,各地为王.特别是占有大量用户的中小企 ...

  8. (转)Android系统自带样式(@android:style/)

    在AndroidManifest.xml文件的activity中配置 1.android:theme="@android:style/Theme" 默认状态,即如果theme这里不 ...

  9. 关于Apache Struts 2 S2-032高危漏洞的一些确认

    2016年4月21日Struts2官方发布两个CVE,其中CVE-2016-3081(S2-032)官方评级为高. 主要原因为在用户开启动态方法调用的情况下,会被攻击者实现远程代码执行攻击. 具体的漏 ...

  10. 新LNMP环境,但是SESSION跨页面或者刷新 session丢失

    唠叨:本地WAMP做了一个微信项目,一切OK,昨天需要在LINUX架设一套LNMP环境.但是,在架设代码的时候,登录总是不成功~~~ 最终解决:权限 其实,作为一个程序猿,只要涉及到服务器内容,都应该 ...