setjmp与longjmp

这里有编写了很好的文章:http://blog.csdn.net/cscmaker/article/details/7584433,我自己试了一个小例子。

#include <setjmp.h>
#include <stdio.h>

void my_print(const char *str, jmp_buf jb)
{
    printf("in my_print()\n");

    if (str == NULL) {
        longjmp(jb, 2);
    }
    printf("my_print: %s\n", str);
}

int main()
{
    int ret = 0;
    char *str = NULL;

    jmp_buf jbuf;
    int jmp_ret = setjmp(jbuf);
    if (jmp_ret == 2) {
        printf("ERROR: name == NULL\n");
        str = "Hevake";
    }
    my_print(str, jbuf);

    return 0;
}

输出结果是:

in my_print()
ERROR: name == NULL
in my_print()
my_print: Hevake

我们可以用setjmp与longjmp实现类似异常处理的功能。

时间: 2024-10-08 17:00:54

setjmp与longjmp的相关文章

浅析C语言中的setjmp与longjmp函数_C 语言

setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理. 先来看一下这两个函数的定义吧: setjmp和longjmp的函数原型在setjmp.h中 函数原型:int setjmp(jmp_buf envbuf); setjmp函数用缓冲区envbuf保存系统堆栈的内容,以便后续的longjmp函数使用.setjmp函数初次启用时返回0值. void longjmp(jmp_buf

Linux setjmp longjmp

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

C标准库参考指南(8)setjmp.h

8. setjmp.h 头文件setjmp用于控制底层调用和函数跳转. 宏: setjmp(); 函数: longjmp(); 变量: typedef jmp_buf 8.1. 变量和定义 变量jmp_buf是一个数组类型,用于存储setjmp和longjmp信息. 8.2. setjmp 声明: int setjmp(jmp_buf environment); 存储当前运行环境environment变量中.如果返回一个非零值,则表明longjmp到达了源码中所运行到的位置.否则表明运行环境已被

异常处理优劣观(转载)

异常处理 Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理.不过,我认为很多人其实并没有真正掌握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道点概念.本文就对三种不同程度和质量的Java异常处理进行了讨论,所阐述的处理异常的方式按手法的高下分为:好,不好和恶劣三种.同时向你提供了一些解决这些问题的技巧. 好 异常处理提供了处理程序错误的统一机制.事实上,Java语言通过向调用者提出异常警告的方式而显著地提升了软件开发中的异常处理能力.这种

Linux 信号signal处理机制

  信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用.  信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断.从它的命名可以看出,它的实质和使用很象中断.所以,信号可以说是进程控制的一部分.  一.信号的基本概念  本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和信号对应的事件.基本概念对于理解和使用信号,对于理解信号机制都特别重要.下面就来看看什么是信号.

《编写高质量代码:改善c程序代码的125个建议》—— 导读

前 言 为什么写作本书 众所周知,C语言是一门既具有高级语言特点,又有汇编语言特点的通用计算机编程语言,无论是操作系统(如Microsoft Windows.Mac OS X.Linux和UNIX等).嵌入式系统与普通应用软件,还是目前流行的移动智能设备开发,随处都可以看见它依然矫健的身影.它能够轻松地应用于各类层次的开发中,从设备驱动程序和操作系统组件到大规模应用程序,它都能够很好地胜任.毋庸置疑,它是二十几年来使用最为广泛.生命力最强的编程语言,它的设计思想也影响了众多后来的编程语言,例如C

协程 [wiki]

协程 维基百科,自由的百科全书 与子例程一样,协程也是一种程序组件.相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛.协程源自Simula和Modula-2语言,但也有其他语言支持.协程更适合于用来实现彼此熟悉的程序组件,如合作式多任务,迭代器,无限列表和管道. 协程最初在1963年被提出.[1] 简单的对比和示例 由于协程不如子例程那样被普遍所知,最好对它们作个比较. 子例程的起始处是惟一的入口点,一旦退出即完成了子例程的执行,子例程的一个实例只会返回一次. 协程可以通过y

优秀开源项目之三:高性能、高并发、高扩展性和可读性的网络服务器架构State Threads

译文在后面. State Threads for Internet Applications Introduction State Threads is an application library which provides a foundation for writing fast and highly scalable Internet Applications on UNIX-like platforms. It combines the simplicity of the multi

如何像NASA顶级程序员一样编程 —— 10条重要原则

引言: 你知道 NASA 顶级程序员如何编写关键任务代码么?为了确保代码更清楚.更安全.且更容易理解,NASA 的喷气推进实验室制定了 10 条编码规则. NASA 的开发者是编程界最有挑战性的工作之一.他们编写代码并将开发安全的关键任务应用程序作为其主要关注点. 在这种情形下,遵守一些严格的编码规则是重要的.这些规则覆盖软件开发的多个方面,例如软件应该如何编码.应该使用哪些语言特性等. 尽管很难就一个好的编码标准达成共识,NASA 的喷气推进实验室(JPL)遵守一个编码规则,其名为"十的次方: