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++程序中,小心对setjmp和longjmp的使用,应为setjmp和longjmp并不能很好地支持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  ==   0  )  
{
 //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);
}

setjump和longjump相关推荐

  1. C错误异常处理,异常处理

    预处理器标识#error的目的是什么啊? 指令 用途# 空指令,无任何效果#include 包含一个源代码文件#define 定义宏#undef 取消已定义的宏#if 如果给定条件为真,则编译下面代码 ...

  2. c++学习笔记之异常

    1.异常 详细见<c++异常分类> 基类exception有一个virtual函数what,返回错误信息(构造函数设定的). 基类exception的派生类有runtime_error(运 ...

  3. 《UNIX环境高级编程》目录

    第一章:UNIX标准及实现 01 函数perror.strerror 第三章:文件I/O 01 C库函数 02 文件描述符.函数open和openat 03 函数read.write.lseek 04 ...

  4. C语言错误处理方法、C++异常处理方法(throw, try, catch)简介

    一.C语言错误处理方法 1.返回值(if - else语句判断错误) 2.errno(linux 系统调用) 3.goto语句(函数内局部跳转) 4.setjmp.longjmp(Do not use ...

  5. C++编程技术之 异常处理(上)

    增强错误恢复能力是提高代码健壮性的最有力途径之一 之所以平时编写代码的时候不愿意去写错误处理,主要是由于这项工作及其无聊并可能导致代码膨胀,导致的结果就是本来就比较复杂的程序变得更加复杂.当然了,前面 ...

  6. Why c++ coroutine?Why libgo?

    时至2018年的今天,C++ 在互联网服务端开发方向依然占据着相当大的份额:百度,腾讯,甚至以java为主流开发语言的阿里都在大规模使用C++做互联网服务端开发,而这恰恰是本文想要讨论的范畴. 第1章 ...

  7. 信号(2)信号处理器函数

    引言: 通过学习本章可以学会设计信号处理器函数的设计规范,以及设计方法(比如非本地跳转的应用) 1.设计信号处理器函数 引言:信号处理器函数应设计的越小越好 降低竞争条件的引发风险 个人理解在多线线程 ...

  8. C++ 协程的近况、设计与实现中的细节和决策

    时至2018年的今天,C++ 在互联网服务端开发方向依然占据着相当大的份额:百度,腾讯,甚至以java为主流开发语言的阿里都在大规模使用C++做互联网服务端开发,而这恰恰是本文想要讨论的范畴. C++ ...

  9. Go 语言踩坑记——panic 与 recover

    题记 Go 语言自发布以来,一直以高性能.高并发著称.因为标准库提供了 http 包,即使刚学不久的程序员,也能轻松写出 http 服务程序. 不过,任何事情都有两面性.一门语言,有它值得骄傲的优点, ...

最新文章

  1. 基于强化学习的自动化剪枝模型
  2. C#读取excel数据到datatable中
  3. java中抽象类继承抽象类_用Java中的抽象类扩展抽象类
  4. 列式存储ClickHouse(一)概述
  5. [case31]dubbo-spring-boot-starter小试牛刀
  6. 语法比较:Julia,Matlab,Python
  7. xis表格怎么打印_Excel做的表格怎么打印
  8. oracle group concat
  9. workbench焊接实例_基于ANSYS Workbench平台和ANSYS经典界面的焊接仿真-工业电子-与非网...
  10. 服务器主板维修教学视频,第60讲 超微服务器主板远程管理讲解与演示
  11. 元气骑士android替换存档教程,元气骑士游戏怎么将存档转移到另一个手机中
  12. 四象限变频器技术介绍
  13. hiveql 没有left()right()函数,可用substr()替代
  14. linux内核计算次方,linux内核bic和cubic实现
  15. TTMS剧院票务管理系统全网最全!!!不接受反驳
  16. 分析N沟道MOS管和P沟道MOS管在电路中的详细应用
  17. 【转】MBBMS CA方案
  18. Apowersoft Streaming Audio Recorder(录音精灵)官方中文版V4.3.5.2 | Apowersoft录音精灵官方下载
  19. 微软发补丁解决0x0000003B蓝屏死机
  20. 《校园网综合解决方案》

热门文章

  1. 网管交换机怎么设置?网管交换机设置方法
  2. 工业以太网交换机的三种转发方式
  3. 选购光纤交换机时需要注意光模块的哪些配置?
  4. 【渝粤教育】国家开放大学2018年春季 3780-21T燃气设备操作与维护 参考试题
  5. 保存点云数据_PCL入门系列三——PCL进行数据读写
  6. node mysql安装目录_nodejs 指定全局安装路径和缓存路径
  7. update core.php 更新_PHP: 更新日志 - Manual
  8. java空类型方法无参_类的无参方法
  9. php nginx 域名重定向,Nginx默认虚拟主机、用户认证、域名重定向
  10. java method方法_Java Method.getTypeParameters方法代碼示例