setjmp 与 longjmp解析

来源:互联网 发布:淘宝店卖衣服去哪进货 编辑:程序博客网 时间:2024/05/21 08:38

setjmp 与 longjmp 提供了C语言中跳转的功能 以下是函数原型

int setjmp(jmp_buf env)

void longjmp(jmp_buf env, int value)

setjmp env 用来建立本地缓冲区并且初始化,用于将来跳转回此处。env将被longjmp使用。如果是从setjmp直接调用返回,setjmp返回值为0。如果是从longjmp恢复的程序调用环境返回,setjmp返回非零值。

longjmp 恢复env所指的缓冲区中的程序调用环境上下文,env所指缓冲区的内容是由setjmp子程序调用所保存。value的值从longjmp传递给setjmplongjmp完成后,程序从对应的setjmp调用处继续执行,如同setjmp调用刚刚完成。如果value传递给longjmp零值,setjmp的返回值为1;否则,setjmp的返回值为value

#include <stdio.h>#include <setjmp.h>jmp_buf buf;void test_set_jmp(){    printf("Now enter test_set_jmp()\n");    longjmp(buf,1);    printf("you'll never see this, because longjmp has jump to another");}int main(int argc, char *argv){    if(setjmp(buf))        printf("Now I am back into main\n");    else{        printf("Now Im here, first time  in main()\n");        test_set_jmp();    }    return 0;}

输出结果:

ivanx@ivanx-V:~/test$ ./a.out 
Now Im here, first time  in main()
Now enter test_set_jmp()
Now I am back into main

可以看出,第一次记录了跳转位置,这样 test_set_jmp 中调用了 longjmp,函数末尾的打印不会被执行。



0 0
原创粉丝点击