实现上下文保存和恢复的一种方式--setjmp与longjmp

简介: 实现上下文保存和恢复的一种方式--setjmp与longjmp

函数原型:

int setjmp(jmp_buf envbuf);

setjmp函数用缓冲区envbuf保存系统堆栈的内容,以便后续的longjmp函数使用。setjmp函数初次启用时返回0值。

void longjmp(jmp_buf envbuf, int val);

longjmp函数中的参数envbuf是由setjmp函数所保存的堆栈环境,参数val设置setjmp函数的返回值。longjmp函数本身是没有返回值的,它执行后跳转到保存envbuf参数的setjmp函数调用,并由setjmp函数调用返回,此时setjmp函数的返回值就是val。

上面的说明有点拗口,通俗的解释是:先调用setjmp,用变量envbuf记录当前的位置,然后调用longjmp,返回envbuf所记录的位置,并使setjmp的返回值为val。当时用longjmp时,envbuf的内容被销毁了。其实这里的“位置”一词真正的含义是栈定指针。

接着让我们看一个小例子吧:

#include <stdio.h> 
#include <setjmp.h>
jmp_buf buf;
void test() {
  printf("in test() \n");
  longjmp(buf, 1);
  printf("333333\n");
}
int main()
{
  if (setjmp(buf))
    printf("111111\n");
  else {
    printf("222222\n");
    test();
  }
  getchar();
  return 0;
}

断点调试,第一次buf为空,还没有保存上下文。

第二次buf已经存在值了。

执行结果

分析:程序先走到setjmp。由于setjmp第一次执行返回的结果是0,所以走的else分支,打印"22222"。接着跳转到test()函数中,继续执行printf打印"in test()“。然后走到longjmp这里,由于longjmp的功能,接下来会跳转到main的setjmp这里继续执行。此时setjmp是第二次执行了,返回值为非0,所以会进入if分支,打印出"111111”。


推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:

相关文章
|
8月前
|
机器学习/深度学习 数据采集 分布式计算
大数据分析中的机器学习基础:从原理到实践
大数据分析中的机器学习基础:从原理到实践
361 3
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
AI时代职业新风口:调研报告揭示57.2%受访者向往AI领域,生成式人工智能(GAI)认证成职场新宠
人工智能(AI)正成为职场新宠,57.2%受访者考虑从事相关职业。AI领域不仅薪资优厚、前景广阔,还充满创新挑战。生成式人工智能(GAI)认证逐渐成为衡量AI技能的重要标准,助力求职者掌握核心知识、提升实战能力及增强合规意识。面对AI时代的机遇与挑战,持续学习、关注行业动态和拓展人脉将成为职场竞争的关键。让我们共同迎接AI带来的美好未来!
|
10月前
|
人工智能 算法 数据挖掘
开源更新|通义3D-Speaker多说话人日志功能
开源更新|通义3D-Speaker多说话人日志功能
|
JSON Java API
java 写一个循环不断请求接口A判断返回值是否符合条件,不符合等待30秒继续请求判断
java 写一个循环不断请求接口A判断返回值是否符合条件,不符合等待30秒继续请求判断
431 0
|
存储 缓存 Unix
QEMU-img工具
QEMU-img工具
2014 1
|
存储 机器学习/深度学习 人工智能
c/c++线性表实现附源码(超详解)
c/c++线性表实现附源码(超详解)
|
消息中间件 安全 算法
通透!从头到脚讲明白线程锁
线程锁在分布式应用中是重中之重,当谈论线程锁时,通常指的是在多线程编程中使用的同步机制,它可以确保在同一时刻只有一个线程能够访问共享资源,从而避免竞争条件和数据不一致性问题。
612 0
|
监控 Windows
Hook函数三步走(SetWindowsHookEx、UnhookWindowsHookEx、CallNextHookEx)
Hook函数三步走(SetWindowsHookEx、UnhookWindowsHookEx、CallNextHookEx)
1196 0
Hook函数三步走(SetWindowsHookEx、UnhookWindowsHookEx、CallNextHookEx)
|
存储 机器学习/深度学习 人工智能
图的存储及基本操作总结(邻接矩阵、邻接表)及C/C++代码实现
图的存储及基本操作总结(邻接矩阵、邻接表)及C/C++代码实现
1803 1