setjmp&longjmp

背景知识

执行环境:CPU中的一些寄存器,保留了程序执行的必要信息

setjmp&longjmp

要实现执行环境的保存,我们可以选择把相关寄存器保存到jmp_buf中;然后在longjmp中从jmp_buf中恢复寄存器的值,恢复之后就回到了setjmp返回的地方

最简单的例子(用来做异常处理):

#include<bits/stdc++.h>
using namespace std;

jmp_buf env;

int my_func(int a,int b){
    if(b==0){
        printf("divide by 0\n");
        longjmp(env,1);
    }
    return a/b;
} 

int main(){
    int res=setjmp(env);
    if(res==0){
        printf("return from setjmp\n");
        my_func(10,0);
    }else{
        printf("return from longjmp: %d\n",res);
    }
    return 0;
}