setjmp与longjmp非局部跳转函数的使用
[root@bogon code]# cat c.c
#include<stdio.h>
#include<setjmp.h>
static jmp_buf env;//定义全局变量env
void job()
{
longjmp(env,2);//会返回到setjmp(env)处,且返回值为2
}
void work(int argc)
{
if(argc==1)//没有参数
longjmp(env,1);//返回到setjmp(env)处,返回值为1
job();//有参数调用job()
}
int main(int argc,char *argv[])
{
switch(setjmp(env))//setjmp(env)初始值为0
{
case 0:
work(argc);//传参数个数过去,argc为1代表没有参数
break;
case 1:
printf("this is from no parameter work()\n");//不带程序参数的输出
break;
case 2:
printf("this is from have parameter job()\n");//带程序参数的输出
break;
}
return 0;
}
[root@bogon code]# gcc c.c
[root@bogon code]# ./a.out
this is from no parameter work()
[root@bogon code]# ./a.out 32
this is from have parameter job()
[root@bogon code]#
现在我们来看一下优化编译器问题
[root@bogon code]# cat c.c
#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h>
static jmp_buf env;
void work(int a,int b,int c)
{
longjmp(env,1);
}
int main(int argc,char *argv[])
{
int a;
register int b;
volatile int c;//将变量声明为volatile,那么编译优化时,该变量的值(300)不会在调用longjmp函数后,重置为setjmp函数调用前的值(30),而其他类型的变量都会重置
a=10;
b=20;
c=30;
if(setjmp(env)==0)
{
a=100;
b=200;
c=300;
work(a,b,c);
}
else
printf("a is %d\nb is %d\nc is %d\n",a,b,c);
return 0;
}
[root@bogon code]# gcc c.c//没有进行编译优化,所以都没有重置
[root@bogon code]# ./a.out
a is 100
b is 200
c is 300
[root@bogon code]# gcc -O c.c//使用选项-O进行编译优化,所以有重置
[root@bogon code]# ./a.out
a is 10
b is 20
c is 300
[root@bogon code]#
为了使程序便于维护,还是应当尽量避免使用setjmp和longjmp,不过有时候在恰当的地方,其用处还是很大的,另外我们还应该限制使用goto一样
setjmp与longjmp非局部跳转函数的使用的更多相关文章
- 【转】浅析C语言的非局部跳转:setjmp和longjmp
转自 http://www.cnblogs.com/lienhua34/archive/2012/04/22/2464859.html C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转 ...
- Unix系统编程()执行非局部跳转:setjmp和longjmp
使用库函数setjmp和longjmp可执行非局部跳转(local goto). 术语"非局部(nonlocal)"是指跳转目标为当前执行函数之外的某个位置. C语言里面有个&qu ...
- 二十、Linux 进程与信号---非局部跳转
20.1 setjmp 和 longjmp 函数 20.1.1 函数介绍 #include <setjmp.h> int setjmp(jmp_buf env); 函数功能:设置非局部跳转 ...
- (C)非局部跳转语句(setjmp和longjmp)
1. 特点 非goto语句在函数内实施跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一语句. 头文件包含#include Void longjmp(jmp_buf env,int val ...
- C语言中setjmp与longjmp学习笔记
C语言中setjmp与longjmp学习笔记 一.基础介绍 头文件:#include<setjmp.h> 原型: int setjmp(jmp_buf envbuf) ,然而longjm ...
- 【转载】setjmp和longjmp函数使用详解
[说明]本文上半部分转载自 wykwdy007 的转载文章 http://blog.csdn.net/wykwdy007/article/details/6535322 --------------- ...
- 进程环境之setjmp和longjmp函数
在C中,goto语句是不能跨越函数的,而执行这样跳转功能的是函数setjmp和longjmp.这两个函数对于处理发生在深层嵌套函数调用中的出错情况是非常有用的. setjmp和longjmp函数也称为 ...
- setjmp和longjmp函数使用详解
源地址:http://blog.csdn.net/zhuanshenweiliu/article/details/41961975 非局部跳转语句---setjmp和longjmp函数.非局部指的是, ...
- setjmp和longjmp函数
关于setjmp函数和longjmp函数有话要说,是UNIX高级环境变成看到了10.10信号那章用到了,研究一下,这里作为补充. setjmp(jmp_buf env_buf) 函数可以将当前的运行环 ...
随机推荐
- Cracking The Coding Interview 4.7_暂存
//原文: // // You have two very large binary trees: T1, with millions of nodes, and T2, with hundreds ...
- Linux(centos) 下curl模拟Http get / post请求 [ curl ]
一.get请求 curl "http://www.baidu.com" 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "http:// ...
- 程序包需要 NuGet 客户端版本“XXXXX”或更高版本,但当前的 NuGet 版本为“XXXXXXXXXX”
工具 - 扩展和更新- visual studio 库
- Mybaties学习
基于现在Mybatis 我没有学习太多,就基于简单的增删改查进行基础学习. 学习资源来自 http://www.cnblogs.com/xdp-gacl/p/4261895.html 1 引入 ...
- logging日志模块,hashlib hash算法相关的库,
logging: 功能完善的日志模块 import logging #日志的级别 logging.debug("这是个调试信息")#级别10 #常规信息 logging.info( ...
- 界面设计-Edit控件的Style设置
以下文字转贴ChinaCock QQ 223717588群: 1. 首先在Form上放一个TEdit类型控件Edit1,最终的效果如下图: 2.选中控件Edit1,点击鼠标右键,在弹出菜单中选择“Ed ...
- Day15作业及默写
1.整理今天内容 PASS 2.现有列表alist = [3,1,-4,2,-6] 按照元素的绝对值大小进行排序 alist = [3,1,-4,2,-6] sorted(alist,key=lamb ...
- mail工具的安装、配置及问题处理
使用mail发邮件时,应先将相关邮件服务启动,本文主要介绍sendmail邮件工具的配置方法和问题处理. 1.安装 ubuntu中sendmail函数可以很方便的发送邮件,ubuntu sendmai ...
- Java实现循环链表
本案例需要完成的任务定义如下:实现一个循环链表(单链表),具备增加元素.删除元素.打印循环链表等功能. 网上许多同类问题的实现方式过于复杂.难懂,本文旨在提出一种实现循环链表的简单.易懂的方法. 定义 ...
- SSH连接虚拟机中的Ubuntu(转)
摘要:主要是解决不能使用ssh远程Ubuntu的问题.使用的远程工具是putty.也可以使用xshell.ubunut12.0.4是装在虚拟机中的.不过这个应该没有什么影响. 一:问题的出现 前两天使 ...