Linux系统中的函数跳转,setjmp() 和longjmp()的使用

简介:

setjmp() 和longjmp()用来进行函数的跳转,并且可以跳回到原来的位置继续执行。当程序员希望在某个时刻,跳回到以前的一个位置执行的时候,setjmp() 和longjmp()就派上用场了。

函数声明:

在setjmp.h中,有如下声明:


int setjmp(jmp_buf env) ;

void longjmp(jmp_buf env, intval) ;

int setjmp(jmp_buf env) ;
功能:保存程序中的当前位置;
参数:有一个参数env, 用来保存程序当前位置的堆栈环境;
返回值:返回int类型;

void longjmp(jmp_buf env, int val) ;
功能:能把控制转回到被保存的位置,即远程跳转;

参数:env:程序当前位置的堆栈环境;
     val:用于设置setjmp() 的返回值
     longjmp执行后跳转到保存env参数的setjmp()调用, 并由setjmp()调用返回, 就好像程序刚刚执行完setjmp()一样,此时setjmp()的返回值就是val。
返回值:返回void类型;

程序举例:

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

jmp_buf position;

void goback() {
    printf("\nhello,\n");
    longjmp(position,1);//跳回setjmp的调用处 - 使得setjmp返回值为1
}
void doWork(){

	printf("\nworking begin\n");
	goback();

    printf("\nworking end\n"); //不会执行该语句,因为已经跳走了


}

int main() {

	int res = setjmp(position);
	if (!res) {
		doWork(); // 进入此行前,setjmp返回0

	}else { // 当longjmp跳转回,setjmp返回1,因此进入此行

        printf("main\n"); // 打印

    }
    return 0;
}

运行结果:

/*

working begin

hello,
main
*/
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值