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语言库中的函数:在跳转操作中具有很强的跨平台性。

相关文章
|
6月前
|
搜索推荐 C语言 C++
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现3
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现
|
6月前
|
存储
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现2
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现
|
6月前
|
C语言
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现1
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现
|
2月前
|
程序员 C++
C 标准库 - <setjmp.h>详解
`&lt;setjmp.h&gt;` 是 C 标准库中的头文件,用于处理程序的非局部跳转。它提供了 `setjmp` 和 `longjmp` 函数,允许程序保存和恢复执行状态,适用于错误处理和复杂控制流(如协程)。主要概念包括跳转和上下文保存。使用时需注意局部变量作用域、不对称性及避免滥用。
54 11
|
6月前
|
搜索推荐 算法
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现4
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现
|
6月前
|
存储 安全 C语言
在C++ 中慎用setjmp和longjmp
在C++ 中慎用setjmp和longjmp
51 0
|
6月前
|
Unix Linux C语言
【C/C++ 跳转函数】setjmp 和 longjmp 函数的巧妙运用: C 语言错误处理实践
【C/C++ 跳转函数】setjmp 和 longjmp 函数的巧妙运用: C 语言错误处理实践
93 0
|
6月前
|
C语言
<C语言错误处理> 非局部跳转<setjmp.h>头文件
<C语言错误处理> 非局部跳转<setjmp.h>头文件
|
C语言
strstr函数strtok函数strerror函数详解【C语言】
strstr函数strtok函数strerror函数详解【C语言】
|
存储 Java C#
【C语言】strerror函数和malloc函数
我的第一门语言就是C,但是学艺不精,中途跑去学了C#和Java后,感觉到了C的重要性,毕竟是最接近底层的语言,又跑回来学C。 毕竟前两门的控制语句,变量什么的都是类似的,回到C后只需要学习一些特定C的语法,比如宏,预编译指令等等,这些对我来说都是陌生的词汇。 前来记录一下陌生的东西。
167 0