setjmp和longjmp

简介: setjmp和longjmp

setjmp和longjmp

在C语言的库中,setjmp.h可能很多人都没用过,甚至不知道。今天也是刚好接触到,来记录一下他的作用。

setjmp和longjmp有什么用?

  • setjmp
int setjmp(jmp_buf env);

The setjmp() function saves various information about the calling environment (typically, the stack pointer, theinstruction pointer, possibly the values of other registers and the signal mask) in the buffer env for later useby longjmp(). In this case, setjmp() returns 0.

翻译过来就是说,setjmp函数会保存当前的有关调用环境的信息,通常是他堆栈指针、指令指针寄存器值和其他信号掩码。保存造缓冲区env中。等待longjmp调用他们。在这种情况下,返回0。

  • longjmp
void longjmp(jmp_buf env, int val);

The longjmp() function uses the information saved in env to transfer control back to the point where setjmp() wascalled and to restore (“rewind”) the stack to its state at the time of the setjmp() call. In addition, anddepending on the implementation (see NOTES), the values of some other registers and the process signal mask maybe restored to their state at the time of the setjmp() call.

longjmp函数使用保存在env中的信息将控制权转移回调用setjmp。此外,,其他一些寄存器的值和进程信号掩码可能会恢复到setjmp调用时的状态。

通俗来说,这两个函数配合起来可以实现跳转的目的,我们来看一下代码:

#include <stdio.h>
#include <setjmp.h>
jmp_buf jmp;
void func(int arg)
{
    printf("arg:%d\r\n", arg);
    longjmp(jmp, 10);
}
int main()
{
    int ret = setjmp(jmp);
    if(ret == 0)
        func(ret);
    printf("ret:%d\n", ret);
    return 0;
}

运行结果如下:

从运行结果来看,流程大概如上图所示:在保存好当前环境后,进入了func函数。func函数中返回以前的状:就是返回到setjmp函数,所以ret被置为10。

应用场景

  1. 异常处理:可以保存一个当前状态,如果遇到错误就返回处理异常。
  2. 状态机:用于不同状态之间的跳转,比如协程。

优点

基于posix api,是C语言库中的函数:在跳转操作中具有很强的跨平台性。

相关文章
|
4月前
|
Ubuntu IDE 开发工具
修复Ubuntu启动时提示"无可启动设备"的问题。
上述步骤旨在提供一套综合的诊断与修复策略。在操作过程中应当小心谨慎,尤其是所有与分区表相关的操作,因为一旦不当操作可能导致数据丢失。若非专业人士则建议在进行重要操作之前备份数据,并在实施修复措施时考虑寻求专业技术人员的帮助。
301 0
|
10月前
|
Java 编译器 Spring
JAVA中切面的使用
AOP(面向切面编程)通过切面、通知、切入点和连接点实现模块化关注点分离。Spring AOP基于代理模式,使用JDK动态代理或CGLIB代理;AspectJ采用字节码增强,在编译或类加载时织入切面逻辑,性能更高。示例代码展示了如何在方法调用前后插入日志记录等操作。
|
安全 编译器 程序员
全面解析C++11新特性:现代编程的新起点(上)
全面解析C++11新特性:现代编程的新起点
全面解析C++11新特性:现代编程的新起点(上)
|
Unix Linux C语言
【C/C++ 跳转函数】setjmp 和 longjmp 函数的巧妙运用: C 语言错误处理实践
【C/C++ 跳转函数】setjmp 和 longjmp 函数的巧妙运用: C 语言错误处理实践
397 0
|
供应链 网络协议 数据安全/隐私保护
|
JavaScript
【vue】vue2 导入外部js文件如何拿到方法的返回值
【vue】vue2 导入外部js文件如何拿到方法的返回值
220 1
|
Python
Python系列(22)—— 排序函数
Python系列(22)—— 排序函数
|
人工智能
阿里上线AI电商工具“绘蛙”,让你的商品第一时间被种草
【2月更文挑战第15天】阿里上线AI电商工具“绘蛙”,让你的商品第一时间被种草
1366 2
阿里上线AI电商工具“绘蛙”,让你的商品第一时间被种草
|
存储 算法
【数据结构】— —查找(折半查找,二叉排序树)
【数据结构】— —查找(折半查找,二叉排序树)
【数据结构】— —查找(折半查找,二叉排序树)
|
存储 前端开发 rax
协程切换的三种底层实现方式
协程切换的三种底层实现方式
357 0