setjmp和longjmp

C语言中,goto语句只允许函数内使用,不允许在函数间使用。而执行这种跳转功能的是函数setjmplongjmp,这两个函数对于处理很深的嵌套函数调用中的出错情况非常有用。

1setjmp函数原型

所需头文件

#include <setjmp.h>

函数说明

setjmp用来保存堆栈环境,然后将目前的地址做一个记号,而在程序其他地方调用longjmp时便会直接跳跃到这个记号位置。然后还原堆栈环境,继续程序执行。setjmp首次返回0,代表已作好记号。若返回非0值代表由longjmp()跳转回来

函数原型

int setjmp(jmp_buf env)

函数传入参数

env:保存堆栈环境,要求声明为全局变量

函数返回值

返回0代表已保存好目前堆栈环境,随时可供longjmp()调用,若返回非0值则代表是由longjmp()返回

 

2longjmp函数原型

所需头文件

#include <setjmp.h>

函数说明

longjmp会还原到由setjmp保存的堆栈环境。然后跳转到setjmp()之后继续程序的流程

函数原型

void longjmp(jmp_buf env, int val)

函数传入参数

env: setjmp所保存的堆栈环境

val: 是提供setjmp()的返回值,此值不可为0,若为0系统自动以1代替

函数返回值

 

3setjmplongjmp函数使用范例

longjmp.c源代码如下:

#include <stdio.h>

#include <setjmp.h>

jmp_buf env ;

int test()

{

    printf("Before longjmp()/n") ;

    longjmp(env, 123456) ;

    printf("After longjmp()/n") ;

    return 0 ;

}

int main()

{

    int val ;

    int i = 1234 ;

    if ( ( val = setjmp( env )) != 0 )

    {

        printf("longjmp call!/n") ;

        printf("val=%d, i=%d/n", val, i ) ;

        return 0 ;

    }

    i = 5678  ;

    test() ;

 

    return 0 ;

}

编译 gcc longjmp.c –o longjmp

执行./longjmp,执行结果如下

Before longjmp()

longjmp call!

val=123456, i=5678

 


摘录自《深入浅出Linux工具与编程》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值