• setjmp和longjmp的使用


    所需头文件

    #include <setjmp.h>  

    函数原型  int setjmp(jmp_buf envbuf)

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

    说到setjmp函数,就不得不说longjmp函数,这两个函数是搭配使用的。

    函数原型  void longjmp(jmp_buf envbuf, int status);

    longjmp函数的中参数envbuf是由setjmp()函数所保存的堆栈环境、参数val设置setjmp函数的返回值。longjmp函数本

    身是没有返回值的,它执行跳转到保存envbuf参数的setjmp函数调用,并由setjmp函数调用返回,此时setjmp函数的

    返回值就是 status。

    函数使程序从前次对setjmp()的调用处继续执行。参数envbuf一般通过调用setjmp()设定。参数statussetjmp()的返回值,用来指示不同地点longjmp()的执行.status 不能设定为零。

     

    通俗的说,先调用setjmp(),用变量envbuf记录当前的位置,然后调用longjmp,返回envbuf所记录的位置,并使setjmp的

    返回值为val。当时是longjmp时,envbuf的内容被销毁了。其实这里的“位置”的真正含义是栈顶指针。

    总之,他们是通过操纵过程活动记录实现的。

    这两个函数的最大用途在于错误处理。

    1.setjmp(jmp_buf  envbuf)必须首先被调用。它表示“使用变量envbuf记录现在的位置。函数返回值为 0 “,第一次调用返回0,以后调用返回longjmp(jmp_buf  envbuf, int i)的第二个参数i

    2.longjmp(jmp_buf envbuf, int i)可以接着被调用,它表示“回到 envbuf所记录的位置, 让它看上去像是

    从原先的setjmp()函数返回一样。 但是函数返回 i, 使代码能够知道它实际上是通过longjmp()

    返回的”。

    3.当使用于longjmp()时,envbuf 的内容被销毁。

    setjmp保存了一份程序计数器和当前的栈顶指针。如果喜欢也可以保存一些初始值。

    longjmp恢复这些值,有效地转移控制并把状态重置回保存状态的时候。因为你从堆栈中展开

    过程活动记录,直到取得保存在其中的值,尽管longjmp()会导致转移,但它和 goto 又有不同,

    区别如下:

    1.  goto语句不能跳出C语言当前的函数(但longjmp可以跳的很远,甚至可以跳到其他文件的函数中)。

    2.  用longjmp只能跳回到曾经到过的地方,在执行setjmp的地方仍留有一个过程活动记录。longjmp

         接受一个额外的整形参数并返回它的值,这可以知道是由longjmp转移到这里的还是从一条语句执行

         后自然而然来到这里的。

    a b c 是三个 函数

    a 调用 b  --> b 调用 c 
    如果 c 不经过 b 直接返回a 者需要用这两个函数。


    一下函数式计算1到100的和。

    #include<stdio.h>
    #include<stdlib.h>
    #include<setjmp.h>
    
    jmp_buf envbuf;     //
    int sum = 0;
    
    void sum1(int i)
    {
    	sum = sum + i;
    	longjmp(envbuf, i);   //
    }
    int main()
    {
    	int i, flag;
    	i = 0;
    	flag = setjmp(envbuf);  //保存函数地址在envbuf 变量中。
    	if (flag < 100)
    	{
    		i++;
    		sum1(i);   
    	}
    	printf("%d
    ", sum);
    }


  • 相关阅读:
    如何经营爱情!
    document.getElementById('myframe')和window.frames[i]的区别
    [WPF] 使用 MVVM Toolkit 构建 MVVM 程序
    [WPF] 使用 Visual Studio App Center 持续监视应用使用情况和问题
    centos 7执行yum update时在clean up阶段挂住
    实现线性结构转树形结构(生成无限层级菜单)
    中文分词——HMM算法
    中文分词——最大匹配法
    爱因斯坦求和约定
    jupyter notebook美化
  • 原文地址:https://www.cnblogs.com/lzq1126/p/5596844.html
Copyright © 2020-2023  润新知