setjump和longjump

int setjmp( jmp_buf env );
void longjmp( jmp_buf env, int value );
    setjmp(j)设置“jump”点,用正确的程序上下文填充jmp_buf 对象j。这个上下文包括程序存放位置、栈和框架指针,其它重要的寄存器和内存数据。当初始化完jump 的上下文,setjmp()返回0 值。setjmp函数的调用时,会保存程序当前的堆栈环境到env参数中;
            以后调用longjmp(j,r)的效果就是一个“长跳转”到由j 描述的上下文处(也就是到那原来设置j 的setjmp()处)。当作为长跳转的目标而被调用时,setjmp()返回r 或1(如果r 设为0 的话)。(记住,setjmp()不能在这种情况时返回0。
  
      通常, 用longjmp()来终止异常,用setjmp()标记相应的异常处理程序, 在调用setjmp的函数返回之前,调用longjmp,否则结果不可预料。
  在使用longjmp时,请遵守以下规则或限制:
    不要假象寄存器类型的变量将总会保持不变。在调用longjmp之后,通过setjmp所返回的控制流中,例程中寄存器类型的变量将不会被恢复。
    不要使用longjmp函数,来实现把控制流,从一个中断处理例程中传出,除非被捕获的异常是一个浮点数异常。在后一种情况下,如果程序通过调用_fpreset函数,来首先初始化浮点数包后,它是可以通过longjmp来实现从中断处理例程中返回。
    C++程序中,小心对setjmplongjmp的使用,应为setjmplongjmp并不能很好地支持C++中面向对象的语义。因此在C++程序中,使用C++提供的异常处理机制将会更加安全。 
#include   <conio.h>  
  #include   <setjmp.h>  
  void   RaiseException ( jmp_buf   jmpbuf)  
  {  
    printf(   "Press   a   key   to   restore   stack   environment...\n"   )   ;  
    getch()   ;  
    longjmp(jmpbuf, 1);  
}  
  int   main()  
  {  
    jmp_buf   jmpbuf   ;  
int   result  ;  
     printf(   "Save   stack   environment...\n"   )   ;  
     result   =   setjmp(jmpbuf)   ;  
if( result  ==   )  
{
 //Do something
 //If anything wrong.
 RaiseException(jmpbuf)  ;  
}
else// the exception handler, return by longjump, non-zero value
{  
         printf(   "longjump()   returned   %d.\n",   result   )   ;  
         exit(0)   ;  
}
 
    return   0   ;  
  }  
程序输出将是如下序列: 
  Saving   stack   environment...  
  Call   MyFunc()...  
  Press   a   key   torestore   stack   environment...  
setjmp()   returned   1
//Example 2
#include <stdio.h>
#include <setjmp.h>
jmp_buf save;
void main()
{
 char c;
 for (;; )
{
    switch ( setjmp( save )) 
{
     case 0:
printf ( "Zero returned from setjmp on setup.\n\n");   
break;              
     case 1:
printf ( "NORMAL PROGRAM OPERATION\n\n" );     
break;
     case 2:
printf ( "WARNING\n\n" );     
break;
     case 3:
 printf ( "FATAL ERROR PROGRAM TERMINATED\n\nReally Terminate? y/n: " );
                        fflush ( stdout );           
                        scanf ( "%1s", &c );
                       c  = tolower ( c );       
if ( c == 'y' ) return ( 1 );
                          printf ( "\n" );       break;
        default:     
printf ( "Should never return here.\n" );     
break;
    }
    process ();
 }
}
void process ()
{
 int i;
 printf ( "Input a number to simulate an error condition: " );
 fflush ( stdout ); scanf ( "%d", &i ); i %= 3;
 i++;               
 longjmp ( save, i);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter操作数据库

1) jmeter不能直接连数据库&#xff0c;需要先添加jar包。 然后将jar包的路径添加到下图&#xff1a; 2) 操作数据库之前要知道数据库的信息&#xff08;ip、端口号、账号、密码&#xff09;&#xff0c;操作哪个数据库就连哪个&#xff1a; 在配置元件-JDBC Connectio…

使用Hystrix DSL创建弹性骆驼应用程序

Apache Camel是一个成熟的集成库&#xff08;到现在已有9年的历史了&#xff09;&#xff0c;它实现了Enterprise Integration Patterns一书中的所有模式。 但是Camel不仅是EIP实现库&#xff0c;它还是一个不断发展&#xff0c;添加新模式并适应行业变化的现代框架。 除了在每…

php7 对象转数组,php7中为对象/关联数组进行解构赋值

在CoffeeScript&#xff0c;Clojure&#xff0c;ES6和许多其他语言中&#xff0c;我们对对象/贴图/等进行了解构&#xff0c;如下所示&#xff1a;obj {keyA: Hello from A, keyB: Hello from B}{keyA, keyB} obj我在php中找到了这个list函数&#xff0c;可以让你像这样构造数…

虚函数表

虚函数   C中的虚函数的实现一般是通过虚函数表(C规范并没有规定具体用哪种方法&#xff0c;但大部分的编译器厂商都选择此方法)。 类的虚函数表是一块连续的内存&#xff0c;每个内存单元中记录一个JMP指令的地址。 注意的是&#xff0c;编译器会为每个有虚函数的类创建一个…

linux bash tutorial

bash read-special-keys-in-bash xdotool linux 登录启动顺序转载于:https://www.cnblogs.com/shaohef/p/9528927.html

centos7安装php8,centos8安装php7.4

一&#xff0c;下载php7.41&#xff0c;官方网站:https://www.php.net/2,下载[rootyjweb source]# wget https://www.php.net/distributions/php-7.4.2.tar.gz说明&#xff1a;在linux上以编译方式安装软件时&#xff0c;多数人都习惯把软件安装到 /usr/local目录下&#xff0c…

C++的四种强制类型转换

C的四种强制类型转换&#xff0c;所以C不是类型安全的。分别为&#xff1a;static_cast , dynamic_cast , const_cast , reinterpret_cast 为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C类型的强制转换呢&#xff1f; 新类型的…

MongoDB系列之——安装和启动

CentOS 7 安装MongoDB 4.0 社区版 1. Yum安装 创建Yum仓库先创建新的文件 vim /etc/yum.repos.d/mongodb-org-4.0.repo  在新文件中填入     [mongodb-org-4.0] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/…

javaone_JavaOne 2012:JavaFX图形技巧和窍门

javaone我回到希尔顿&#xff08;皇家宴会厅B&#xff09;看了Richard Bair的&#xff08;Oracle Java Client Architect&#xff09;的“ JavaFX图形技巧和窍门”。 Bair与FX Experience相关联&#xff0c;并且显然了解JavaFX。 拜尔说&#xff0c;他演讲的主题是表演。 他告诫…

php pdo 参数绑定,PDO预处理之参数绑定和列绑定

摘要&#xff1a;PDO查询中&#xff0c;2个绑定操作&#xff1a;参数绑定与列绑定&#xff1b;参数绑定&#xff1a;bindParm() 和 bindValue();bindParm(:占位符,变量,类型常量) 类型常量默认为字符串bindValue(:占位符,值或变量,类型常量) 如果直接传值&#xff0c;可省略类型…

自定义C++异常处理

例1&#xff1a;自定义一个继承自excepton的异常类myException C标准中&#xff0c;定义在<stdexcept>中的任何异常类都派生自exception Class&#xff0c;本例也只是简单地由exception继承&#xff0c;在try段抛出一个异常并捕捉。代码如下&#xff1a; /* test.cpp ve…

DCL并非单例模式专用

我相信大家都很熟悉DCL&#xff0c;对于缺少实践经验的程序开发人员来说&#xff0c;DCL的学习基本限制在单例模式&#xff0c;但我发现在高并发场景中会经常遇到需要用到DCL的场景&#xff0c;但并非用做单例模式&#xff0c;其实DCL的核心思想和CopyOnWrite很相似&#xff0c…

使用CLI扩展和重新平衡Couchbase集群

Couchbase通过多种方式提供高可用性和灾难恢复 &#xff1a; 同质簇 复写 集群内复制 备份还原 机架区意识 该博客将展示如何使用Couchbase命令行界面&#xff08;CLI&#xff09;创建Couchbase集群。 此外&#xff0c;还可以使用Couchbase REST API和Couchbase Web Consol…

将php源码修改成存在注入的源码,天融信关于ucms系统存在代码注入漏洞的分析...

一、背景介绍UCMS是一款简单的开源内容管理系统&#xff0c;可以非常方便的通过它来快速开发各种各种企业站、文章站、站群系统。系统兼容PHP5.2–PHP7.0&#xff0c;在APACHE、NGINX、IIS上都能使用&#xff0c;支持MySQL SQLite两种数据库。后台简洁高效&#xff0c;上手容易…

第1章 计算机系统漫游(深入理解计算机系统)

1 #include <stdio.h> 2 3 int main() 4 { 5 printf("hello, world\n"); 6 } 1.1 信息就是位上下文 hello程序的声明周期是从一个源程序开始的&#xff0c;即程序员利用编辑器创建并保存的文本文件&#xff0c;文件名是hello.c。源程序实际上就是一个由值…

java impliments,dubbo使用GenericService泛化调用

我们项目中常见场景&#xff0c;java应用内部接口都是使用dubbo&#xff0c;某个非java应用需要调用我们的接口的时候&#xff0c;无法使用dubbo&#xff0c;这是我们需要给它提供其他形式的接口&#xff0c;如restful api等等&#xff0c;这时我们需要为这个接口开发而增加额外…

使用Eclipse 创建 搭建SpringBoot项目

之前用IDEA 创建Springboot 项目感觉十分简单&#xff0c;但是常用的毕竟是Eclipse 所以开一个帖子记录一下Eclipse 如何创建 Springboot 项目 第一步&#xff1a;Help -> Eclipse Marketplace… 在search 中输入 STS install 即可&#xff01; 第二部&#xff1a;new -&g…

static函数与普通函数区别

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式&#xff0c; 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序&#xff0c; 当一个源程序由多个源文件…

zendguard php5.4,ZendGuardLoader6.0.0支持PHP5.4.x系列

不知不觉&#xff0c;现在Zend Guard Loader发布了6.0.0版本&#xff0c;支持PHP 5.4.x系列。官方地址&#xff1a;http://www.zend.com/en/products/guard/downloads (需要注册用户后下载)这里提供下常用的版本Windows&#xff1a;附件&#xff1a;ZendGuardLoader-70429-PHP-…

camel mq_Camel:构建基于消息的应用程序

camel mq这是一篇长文章&#xff0c;包含三个单独的主题&#xff1a; Java的Apache Camel入门 使用CamelRunner改善路线的启动 使用Camel构建基于消息的应用程序 但是&#xff0c;由于我准备了包含所有这些材料的camel-demo-1.0.0-SNAPSHOT-project.zip &#xff0c;因此我认…