c setjmp longjmp

http://coolshell.cn/?s=setjmp

http://www.cnblogs.com/hazir/p/c_setjmp_longjmp.html

 1 double divide(double to, double by, jmp_buf env)
 2 {
 3     if(by == 0)
 4         if (env)
 5             longjmp(env, 1);
 6         else
 7             return 0;
 8     else
 9         return to/by;
10 }
11
12 void f()
13 {
14     jmp_buf env;
15     int ret = setjmp(env);
16     printf("jmp: %d\n", ret);
17     if(ret == 0)
18     {
19         printf("result: %lf\n", divide(2.0, 0, env));
20     }
21     else
22     {
23         printf("error: %d\n", ret);
24     }
25 }
时间: 2024-12-29 23:36:26

c setjmp longjmp的相关文章

setjmp & longjmp实现分析

如何使用setjmp & longjmp,就不再细说了,请参考APUE 7.10. 本文解释如下知识点:1.简单介绍X86_64的寄存器2.setjmp & longjmp是怎么实现的.3.为什么能从setjmp处多次返回.4.从setjmp返回时,那些数据是无效了,如何避免. 本文没有画出函数调用栈桢的图,如果对汇编不是很熟悉的话,最好边看边画^_^,会事关功倍. 下文是通过反汇编如下代码来分析的 #include <setjmp.h> #include <stdio.

函数 setjmp, longjmp, sigsetjmp, siglongjmp

一,相关函数接口 1,setjmp,longjmp,sigsetjmp,siglongjmp   #include <setjmp.h> int setjmp(jmp_buf env); int sigsetjmp(sigjmp_buf env, int savesigs);    //savesigs非0时,在env中保存进程当前信号屏蔽字. void longjmp(jmp_buf env, int val); void siglongjmp(sigjmp_buf env, int val

setjmp/longjmp

1.setjmp/longjmp属于传统的错误处理 2.setjmp/longjmp是对goto语句的补充,goto只能实现局部跳转,setjmp/longjmp可以实现全局跳转 3.setjmp/longjmp与goto都有缺陷 传统错误处理的3种方式是: 1.设置全局错误状态,标准c中使用errno与perror函数来支持 2.使用标准c库中的信号 3.使用setjmp/longjmp setjmp/longjmp

Linux setjmp longjmp

/********************************************************************* * Linux setjmp longjmp * 说明: * 最近在看cmockery源代码的时候发现setjmp和longjmp函数,于是查了 * 相关的内容,发现真是个好东西,可以完成函数之间的直接跳转. * * 2016-5-7 深圳 南山平山村 曾剑锋 ************************************************

setjmp()/longjmp()的使用方法

setjmp和longjmp.为了让你实现复杂的流控制,程序在系统里面运行完全依靠内存(代码段,全局段,堆存储器,栈存储器)和寄存器的内容(栈指针,基地址,计数器),setjmp保存当前的寄存器里面的内容,longjmp是恢复这些内容.longjmp返回setjmp程序当前的状态 先看一个例子: #include <csetjmp> #include <cstdio> #include <windows.h> int main() { jmp_buf env; int

setjmp和longjmp

此文是学习 C专家编程 中的笔记. setjmp和longjmp是C语言所独有的,它们部分弥补了C语言有限的转移能力. 函数说明(来自wiki百科): int setjmp(jmp_buf env) 建立本地的jmp_buf缓冲区并且初始化,用于将来跳转回此处.这个子程序保存程序的调用环境于env参数所指的缓冲区,env将被longjmp使用.如果是从setjmp直接调用返回,setjmp返回值为0.如果是从longjmp恢复的程序调用环境返回,setjmp返回非零值. void longjmp

【C语言天天练(五)】setjmp和longjmp

setjmp和longjmp组合可以实现跳转,与goto语句有相似的地方.但有以下不同: 1.用longjmp只能跳回到曾经到过的地方.在执行setjmp的地方仍留有一个过程活动记录.从这个角度看,longjmp更像是"从何处来"而不是"往何处去".longjmp接收一个额外的整型参数并返回它的值,这可以知道是由longjmp转移到这里的还是从上一条语句执行后自然而然来到这里的. 2.goto语句不能跳出C语言当前的函数,而longjmp可以跳的更远,可以跳出函数,

C语言中利用setjmp和longjmp做异常处理

错误处理是任何语言都需要解决的问题,只有不能保证100%的正确运行,就需要有处理错误的机制.异常处理就是其中的一种错误处理方式. 1 过程活动记录(Active Record) C语言中每当有一个函数调用时,就会在堆栈(Stack)上准备一个被称为AR的结构,抛开具体编译器实现细节的不同,这个AR基本结构如下所示. 每当遇到一次函数调用的语句,C编译器都会产生出汇编代码来在堆栈上分配这个AR.例如下面的C代码: void a(int i) { if(i==0){ i = 1; } else {

C中setjmp和longjmp用法

C中提供了goto语法,可以通过goto跳转到函数体内部标记的某一行代码,但是却无法跳出函数之外的任意位置. 为了解决这个限制,C函数库提供了setjmp()和longjmp()函数,它们分别承担非局部位置记录标号和goto作用. 使用这两个函数需要包含头文件<setjmp.h> int setjmp(jmp_buf env) 建立本地的jmp_buf缓冲区并且初始化,用于将来跳转回此处.这个子程序保存程序的调用环境于env参数所指的缓冲区,env将被longjmp使用.如果是从setjmp直