关于setjmp函数和longjmp函数有话要说,是UNIX高级环境变成看到了10.10信号那章用到了,研究一下,这里作为补充。

  setjmp(jmp_buf env_buf) 函数可以将当前的运行环境存入jmp_buf变量中,函数默认返回值是返回0。直到longjmp修改该值(!0)后会调回setjmp函数处。

  jmp_buf,是某种形式的数组,其中存放在调用longjmp时能用来恢复栈状态的所有信息。

  那么,当jmp回来后原函数定义的变量是怎样变化的捏??(答案是:不一定)这里又用几个不同类型的变量来看一下。+编译器优化对运行结果产生的影响。

  代码如下:

#include <stdio.h>
#include <setjmp.h> static jmp_buf jmp_env; static void f1(int ,int ,int , int );
static void f2(void); static int globval = ; int main(void)
{
/* 4 kinds variables*/
int autoval = ;
register int regival = ;
volatile int volaval = ;
static int statval = ;
int retval;
if ( retval = setjmp(jmp_env) ){ /* default value is 0, so this will run when returns from longjmp()*/
printf("after longjmp: %d\n", retval);
printf("globval=%d,autoval=%d,regival=%d,volaval=%d,statval=%d\n",globval,autoval,regival,volaval,statval);
//exit(0);
return ;
}
/*
* Change variables's value before calc longjmp.
*/
globval = ; autoval = ; regival = ; volaval = ; statval = ;
f1(autoval, regival, volaval, statval);
return ;
} static void f1(int i,int j,int k, int l)
{
printf("in f1():\n");
printf("globval=%d,autoval=%d,regival=%d,volaval=%d,statval=%d\n",globval,i,j,k,l);
f2();
} static void f2()
{
printf("in f2():\n");
longjmp(jmp_env, );
}

结果如下:

  分析一下:gcc 直接编译没有进行优化,所有变量都会被更改;

       gcc -O  使用编译器优化,其中一种优化包括使用寄存器中的int值来读取,而不是去存储器中读变量。导致这里取到的普通局部变量和寄存器变量是之前的值,并不是更新之后的最新值。

  大多实现并不回滚到这些自动变量和寄存器变量的值,不想使其回滚的话有两种方法:

    1.声明为静态变量static

    2.声明为全局变量

    3.声明为volatile变量(volatile)作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。这是用来防编译器优化的!!!如果要

     编写一个非局部跳转的可移植程序必须要使用volaitle关键字

      

    

setjmp和longjmp函数的更多相关文章

  1. 【转载】setjmp和longjmp函数使用详解

    [说明]本文上半部分转载自 wykwdy007 的转载文章 http://blog.csdn.net/wykwdy007/article/details/6535322 --------------- ...

  2. 进程环境之setjmp和longjmp函数

    在C中,goto语句是不能跨越函数的,而执行这样跳转功能的是函数setjmp和longjmp.这两个函数对于处理发生在深层嵌套函数调用中的出错情况是非常有用的. setjmp和longjmp函数也称为 ...

  3. setjmp和longjmp函数使用详解

    源地址:http://blog.csdn.net/zhuanshenweiliu/article/details/41961975 非局部跳转语句---setjmp和longjmp函数.非局部指的是, ...

  4. 学习之"setjmp和longjmp函数"

    Linux学习之"setjmp和longjmp函数"   转贴,原文地址:http://www.cnblogs.com/lq0729/archive/2011/10/23/2222 ...

  5. setjmp()和longjmp()函数

    之前我们讲到了过程活动记录(AR),那么如何来操纵AR呢,一个可能的方法是,根据局部变量的地址进行推算,例如对于上面的a函数,执行a函数时的当前AR地址就是参数i的地址偏移8个字节,也就是 ((cha ...

  6. linux系统编程:setjmp和longjmp函数用法

    #include <stdio.h> #include <setjmp.h> //jmp_buf:数组,保存栈信息即运行环境 jmp_buf buf; double Divid ...

  7. 非本地跳转之setjmp与longjmp

    非本地跳转(unlocal jump)是与本地跳转相对应的一个概念. 本地跳转主要指的是类似于goto语句的一系列应用,当设置了标志之后,可以跳到所在函数内部的标号上.然而,本地跳转不能将控制权转移到 ...

  8. C语言中setjmp与longjmp学习笔记

    C语言中setjmp与longjmp学习笔记 一.基础介绍 头文件:#include<setjmp.h> 原型:  int setjmp(jmp_buf envbuf) ,然而longjm ...

  9. setjmp与longjmp

    在C中有时我们会使用goto语句用于运行跳转,可是不能跨越函数 #include <stdio.h> void func2() { int num = 0; dst2: if (num & ...

随机推荐

  1. 04 Python基础数据类型

    目录: 1) 整型 2) 为什么使用16进制以及用在哪里 3) 浮点型 4) 字符串型 5) 布尔型 6) 查看数据类型 7) 复数型 8) input() 9) print() 10) % 格式化输 ...

  2. Spring 4 整合RMI技术及发布多个服务(xjl456852原创)

    rmi需要建立两个项目,一个是服务端的项目,一个是客户端的项目.服务端项目启动后,再启动客户端项目去调用服务端的方法. 我们建立两个maven项目: pom.xml配置: <?xml versi ...

  3. java中List遍历删除元素-----不能直接 list.remove()

    https://blog.csdn.net/github_2011/article/details/54927531 这是List接口中的方法,List集合调用此方法可以得到一个迭代器对象(Itera ...

  4. poj 3074

    题意:解数独 分析: 完整的数独有四个充要条件: 1.每个格子都有填数字 2.每列都有1~9中的每个数字 3.每行都有1~9中的每个数字 4.每个9宫格都有1~9中的每个数字 可以转化成精确覆盖问题. ...

  5. 通过JQUERY获取SELECT OPTION中选中的值

    遇到一样学一样. 一个是取KEY,一个是取VALUE,一个是取所有文本. var dbuser_select = $("#dbuser_select option:selected" ...

  6. WINDOW 专家

    http://www.cnblogs.com/shanyou/category/725986.html

  7. laravel5.5更新到laravel5.7

    为什么要更新呢?因为项目用的第三方后台扩展包,有很些bug,不够完美.想要一个漂亮的后台,那个后台只支持5.7. 然后,我就开始更新框架了. 修改后:"php": "&g ...

  8. 编译Linux使用的.a库文件

    编译Linux使用的.a库文件 首先是须要编译成.a的源文件 hello.h: #ifndef __INCLUDE_HELLO_H__ #define __INCLUDE_HELLO_H__ void ...

  9. [Algorithm] Determine if two strings are an anagram

    The anagram test is commonly used to demonstrate how an naive implementation can perform significant ...

  10. [Vue-rx] Disable Buttons While Data is Loading with RxJS and Vue.js

    Streams give you the power to handle a "pending" state where you've made a request for dat ...