Linux setjmp longjmp

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

一、参考文章:
    1. C 语言中 setjmp 和 longjmp
        http://www.cnblogs.com/hazir/p/c_setjmp_longjmp.html
    2. setjmp(3) - Linux man page
        http://linux.die.net/man/3/setjmp

二、Demo:
    #include <stdio.h>
    #include <stdlib.h>
    #include <setjmp.h>

    int main(int argc, char *argv) {
        jmp_buf env;
        int i;

        i = setjmp(env);
        printf("i = %d.\n", i);
        printf("check position for exit before.\n");
        if ( i != 0 ) exit(0);

        printf("check position for exit after.\n");

        longjmp(env, 2);
        printf("This line does not get printed.\n");
    }

三、结果:
    [email protected]:~/c_program$ ./a.out
    i = 0.
    check position for exit before.
    check position for exit after.
    i = 2.
    check position for exit before.
    [email protected]:~/c_program$ 
时间: 2024-10-04 09:52:07

Linux setjmp longjmp的相关文章

setjmp &amp; 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的使用

1.setjmp setjmp的工作原理: 调用这个函数的时候,它会保存执行现场,并返回0:之后调用longjmp,可恢复到setjmp保存的现场,setjmp再次返回,不过这次该函数返回非0 输出结果: 通过setjmp和longjmp捕获异常 参考链接: 宋宝华:让Linux的段错误(segmentation fault)不再是一个错误  https://mp.weixin.qq.com/s/cemhlZMqGOoLpzKe4Vm5TQ 原文地址:https://www.cnblogs.co

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 { 1

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

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

setjmp()、longjmp() Linux Exception Handling/Error Handling、no-local goto

目录 1. 应用场景 2. Use Case Code Analysis 3. 和setjmp.longjmp有关的glibc and eglibc 2.5, 2.7, 2.13 - Buffer Overflow Vulnerability 1. 应用场景 非局部跳转通常被用于实现将程序控制流转移到错误处理模块中:或者是通过这种非正常的函数返回机制,返回到之前调用的函数中 1. setjmp.longjmp的典型用途是异常处理机制的实现:利用longjmp恢复程序或线程的状态,甚至可以跳过栈中

C语言中setjmp与longjmp学习笔记

一.基础介绍 ?? ?头文件:#include<setjmp.h> ?? ?原型:??int?setjmp(jmp_buf envbuf) ?? ?宏函数setjmp()在缓冲区envbuf中保存系统堆栈里的内容,供longjmp()以后使用.首次调用setjmp()宏时,返回值为0,然而longjmp()把一个变原传递给setjmp(),该值(恒不为0)就是调用longjmp()后出现的setjmp()的值. void longjmp(jmp_buf envbuf,int status);

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