Setjmp 与longjmp

翻译 2015年07月10日 10:16:53
Setjmp 与longjmp
1.这两个函数是c语言特有的函数
2.setjmp-longjmp组合的用处类似于游戏中的存盘读盘功能,经常被用于类似C++的异常恢复操作。
例子演示:
//int setjmp(jmp_buf envbuf);
//setjmp函数用缓冲区envbuf保存系统堆栈的内容,以便后续的longjmp函数使用.setjmp函数初次启用时返回0值
//void longjmp(jmp_buf envbuf, int val);
//longjmp函数中的参数envbuf是由setjmp函数所保存的堆栈环境,参数val设置setjmp函数的返回值.
//它执行后跳转到保存envbuf参数的setjmp函数调用,并由setjmp函数调用返回,此时setjmp函数的返回值就是val.
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>
static jmp_buf buf;
int main(void)
{
    volatile int b = 3;

    if (setjmp(buf) != 0)//函数第一次调用返回0
    {
        printf("%d\n", b);
        exit(0);
    }
    b = 5;
    longjmp(buf, 1);   //第二个参数值1就是setjmp函数的返回值
    printf("i will never be executed!");//这句打印永远不会被执行到
}

void longjmp(jmp_buf envbuf, int val);
总结
setjmp/longjmp的最大用处是错误恢复,类似try ...catch...
他们的功能比goto强多了,goto只能在函数体内跳来跳去,而setjmp/longjmp可以在到过的所有位置处

setjmp与longjmp原理分析

一、setjmp与longjmp的用法参考下面的文章         http://blog.csdn.net/chenyiming_1990/article/details/8683413 二、s...
  • stillvxx
  • stillvxx
  • 2014年01月08日 11:43
  • 1594

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

错误处理是任何语言都需要解决的问题,只有不能保证100%的正确运行,就需要有处理错误的机制。异常处理就是其中的一种错误处理方式。1 过程活动记录(Active Record)C语言中每当有一个函数调用...
  • smstong
  • smstong
  • 2016年02月24日 14:55
  • 2700

setjmp, longjmp用法简介

setjmp和longjmp其实就是goto的升级版,goto只能在同一个函数中跳转,但是setjmp和longjmp可以实现在不同的函数之间跳转。 下面是一个简单的示例演示,代码+运行结果,几行注...
  • wzzfeitian
  • wzzfeitian
  • 2013年07月14日 16:51
  • 2662

C异常处理机制:setjmp和longjmp

setjmp()和longjum()是通过操纵过程活动记录实现的。它是C语言所独有的。它们部分你不了C语言有限的转移能力。这个两个函数协同工作,如下所示:     *setjmp(jmp_buf j)...
  • bytxl
  • bytxl
  • 2015年01月16日 16:18
  • 1082

linux系统中的setjmp()和longjmp()函数

1. 作用: setjmp()和longjmp() 可以实现非局部控制转移即从一个函数到另外一个函数的跳转。 2. 函数原型: #include int setjmp(jmp_buf env); v...
  • c1194758555
  • c1194758555
  • 2016年10月10日 18:26
  • 1015

C语言之setjmp和longjmp详细剖析

我希望看这篇文章的你对C++的传统异常处理,即try...catch...throw有了解(不是Windows SEH),这样才能方便你最深入的理解这2个C语言的反人类函数。 当然如果不了解就先看下...
  • a1875566250
  • a1875566250
  • 2014年10月20日 11:23
  • 2403

探秘C函数栈帧---实现自己的setjmp/longjmp

前言 最近再看《C标准库》看到了setjmp和longjmp函数这里,所以就打算好好学习下C的函数栈帧。 __start 在标准C库中,它是通过汇编语言完成的,但是我们这里为了研究原理,所以用C 语言...
  • zmrlinux
  • zmrlinux
  • 2015年11月18日 22:18
  • 381

setjmp和longjmp很难和C++相处

setjmp和longjmp很难和C++相处     C程序员唯有以setjmp和longjmp才能近似这样的行为。但是longjmp在C++中有一个严重的缺陷:当它调整栈的时候,无法调用局部对...
  • chenglinhust
  • chenglinhust
  • 2013年08月15日 08:57
  • 1020

C中setjmp和longjmp用法

C中提供了goto语法,可以通过goto跳转到函数体内部标记的某一行代码,但是却无法跳出函数之外的任意位置。 为了解决这个限制,C函数库提供了setjmp()和longjmp()函数,它们分别承担非局...
  • oktears
  • oktears
  • 2015年01月28日 16:32
  • 1719

构建C协程之setjmp/long_jmp篇

原理简介 在标准C中的头文件中定义了一组函数 setjmp / long_jmp 用来实现“非本地跳转”的功能,利用 setjmp 可以保存当前执行线索状态,稍后通过 long_jmp 函数...
  • kobejayandy
  • kobejayandy
  • 2014年12月06日 22:16
  • 6219
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Setjmp 与longjmp
举报原因:
原因补充:

(最多只允许输入30个字)