非局部跳转函数 setjmp()与longjmp()

Posted 快第三个十年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非局部跳转函数 setjmp()与longjmp()相关的知识,希望对你有一定的参考价值。

#include <setjmp.h>

  int setjmp(jmp_buf env);

  returns 0 on initial call,nonzero on return via longjmp()

  void longjmp(jmp_env,int val);

setjmp()函数初次执行的时候返回的是0值,随后的返回值与后续执行的longjmp()函数有了关系,正是longjmp()函数中的val参数

setjmp()只能在以下语境中使用:

1.构成选择或者迭代的(if,switch,while)整个控制表达式;

2.作为!的操作对象,其最终表达式构成了选择或者迭代语句的整个控制表达式。

3.作为比较操作(==  != < )的一部分,另一操作的对象必须是一个整数常量表达式且其最终表达式构成了选择或者迭代语句的整个控制表达式。

4.作为独立的函数调用,且没有嵌入到更大的表达式中去。

!!! 不能写成这样  s=setjmp();  即不能把这个函数的返回值赋值给一个变量。

head.h

  1 #include <sys/uio.h>
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <unistd.h>
  5 #include <stdlib.h>
  6 #include <stdio.h>
  7 #include <string.h>
  8 #include <fcntl.h>
  9 #include <errno.h>
 10 #include <setjmp.h>

 

 

 

  1 #include "head.h"
  2 
  3 static jmp_buf env;
  4 
  5 static void f2 (void)
  6 {
  7         longjmp(env,2);
  8 }
  9 
 10 static void f1 (int argc)
 11 
 12 {
 13         if(argc==1)
 14                 longjmp(env,1);
 15         f2();
 16 }
 17 
 18 int main (int argc,char *argv[])
 19 {
 20 /*初次调用setjmp值为0 然后根据命令行提供的参数是否为1来决定为1则第二次调用setjmp转到case 1否则转到case2*/
 21 
 22         switch(setjmp(env))
 23         {
 24                 case 0:
 25                 printf("Calling f1() after initial setjmp()\\n");
 26                 f1(argc);
 27                 break;
 28                 case 1:
 29                 printf("We jumped back from f1()\\n");
 30                 break;
 31                 case 2:
 32                 printf("We jumped back from f2()\\n");
 33                 break;
 34         }
 35         return 0;
 36 }

    

 其执行结果如下所示:

以上是关于非局部跳转函数 setjmp()与longjmp()的主要内容,如果未能解决你的问题,请参考以下文章

(C)非局部跳转语句(setjmp和longjmp)

二十Linux 进程与信号---非局部跳转

非本地跳转之setjmp与longjmp

第5章 进程环境_非局部跳转

setjmp和longjmp浅析

setjmp和longjmp浅析