0 总结 longjmp与setjmp语句之间的变量赋值会丢失。...变量在setjmp和longjmp之间有修改。 变量没有volatile。...LONGJMP(3) NAME longjmp, siglongjmp - nonlocal jump to a saved stack context SYNOPSIS...#include void longjmp(jmp_buf env, int val); void siglongjmp(sigjmp_buf env..., int val); NOTES The values of automatic variables are unspecified after a call to longjmp()
其实可以通过setjmp()和longjmp()配合使用 描述 和goto很相似, 但是可以从一个函数到另外一个函数的跳转,常常用在异常处理上面....这两个函数需要正确使用,否则会破坏程序顺序执行方式 头文件 #include setjmp()和longjmp() int setjmp(jmp_buf env); 将当前上下文保存在...jmp_buf结构体中(入栈),并返回0 void longjmp(jmp_buf env,int val); 从env变量jmp_buf结构体中恢复setjmp()保存的上下文(出栈,并跳转) 由于跳转...进入 setjmp()函数 后,由于发现除法为0,所以使用 longjmp(env,1)函数 ,恢复 setjmp() 保存的上下文,也就是直接返回到了 main()函数 处理 setjmp(env)...delta<b)&&(b<delta))) { return a/b ; } else { longjmp
而这整个功能的主要依靠setjmp和longjmp来实现。...(jmp_buf env,int val) 在调用了setjmp后调用longjmp可以恢复保存的值并有效的将setjmp保存的计数器和栈信息恢复到之前的状态,这个过程也是堆栈展开的过程。...因为longjmp是回到原来保存程序状态的位置,因此也可以称之为从哪里来到哪里去。...printf("开始执行TestSuit函数\n"); longjmp(j,1); /*下面的代码将不会被执行*/ printf("这是段永不被执行的代码\n"); } int...因此程序状态恢复到setjmp的位置,又因为在longjmp的第二个参数设置了setjmp的返回值,因此TestSuit函数中longjmp后的代码将不被执行。
参考链接: C++ longjmp()和setjmp() 这篇讲的不错: http://blog.csdn.net/smstong/article/details/50728022 首先Active...Record 然后EBP,ESP等指针 2 通过setjmp和longjmp操纵AR,完成任意跳转 setjmp/longjmp主要从嵌套的函数调用中跳出来。 ...void b() { c(); printf("b() is called\n"); } void c() { printf("c() is called\n"); longjmp... 因为,longjmp的时候,不保证局部对象析构函数的调用。 ...longjmp()跳转前局部对象可能并不会析构(g++),也可能析构(VC++),C++标准对此并无明确要求。这种依赖于具体编译器版本的代码是应该避免的。
setjmp/longjmp 实现协程 五、总结 一、前言 在 C 标准库中,有两个威力很猛的函数:setjmp 和 longjmp,不知道各位小伙伴在代码中是否使用过?...Invoking longjmp from a nested signal handler is undefined....因此,C 语言中为我们提供了 longjmp 函数来实现远程跳转,从它的名字就可以额看出来,也就是说可以跨函数跳转。...通过 longjmp 跳转过来时:返回非 0,此时的返回值是由 longjmp 的第二个参数来指定的。 根据以上这 2 种不同的值,我们就可以进行不同的分支处理了。...有一点需要注意:setjmp/longjmp 仅仅是改变了程序的执行顺序,应用程序自己的一些数据如果需要回滚的话,需要我们自己手动处理。 ? 四、利用 setjmp/longjmp 实现协程 1.
一、C语言错误处理方法 1、返回值(if … else语句判断错误) 2、errno(linux 系统调用) 3、goto语句(函数内局部跳转) 4、setjmp、longjmp(Do not...use setjmp and longjmp in C++ programs; these functions do not support C++ object semantics. ) #...If setjmp returns as a result of a longjmp call, it returns the value argument of longjmp, or if the... value argument of longjmp is 0,setjmp returns 1....Restores stack environment and execution locale. void longjmp( jmp_buf env, int value ); ?
协程有多种语言的实现方式,对于C语言来说,C标准库里有“非局部跳转”函数setjmp和longjmp,它们分别保存和恢复:栈指针、程序计数器、被调用者保存的寄存器和ABI要求的任何其他内部状态。...VPP协程模型 VPP的协程便是由setjmp/longjmp实现。...使用longjmp/setjmp的轻量级多任务协程,由应用进程自行进行调度,不受操作系统调度机制的影响,上下文切换只损耗调用longjmp/setjmp的时间。...代码使用汇编编写,只关注一下对应的API接口, clib_longjmp_t 保存CPU寄存器状态 stack 保存堆栈信息 /* Return given value to saved context.... */ 跳转到setjmp设置点,reurn_value 就是跳转到clib—setjmp返回数值 void clib_longjmp (clib_longjmp_t * save, uword return_value
, VLIB_PROCESS_RETURN_LONGJMP_RETURN); if (r == VLIB_PROCESS_RETURN_LONGJMP_RETURN) /*恢复到挂起点*/...clib_longjmp (&p->resume_longjmp, VLIB_PROCESS_RESUME_LONGJMP_RESUME); return r; } 而挂起的原因有等待事件和等待时钟..., VLIB_PROCESS_RESUME_LONGJMP_SUSPEND); if (r == VLIB_PROCESS_RESUME_LONGJMP_SUSPEND) clib_longjmp..., VLIB_PROCESS_RESUME_LONGJMP_SUSPEND); if (r == VLIB_PROCESS_RESUME_LONGJMP_SUSPEND) {...(&p->return_longjmp, VLIB_PROCESS_RETURN_LONGJMP_SUSPEND); } /* Return amount of time still left
文章目录 前言 一、c语言中协程切换方式 二、使用setjmp 和 longjmp实现协程切换 1.setjmp和longjmp函数简介 2.协程实现 三、使用switch-case实现协程切换 1...二、使用setjmp 和 longjmp实现协程切换 1.setjmp和longjmp函数简介 setjmp和longjmp是C99标准中文件里定义的两个函数,定义如下: int setjmp...(jmp_buf env); void longjmp(jmp_buf env, int val); /*setjmp() and longjmp(3) are useful for dealing...当是通过longjmp函数跳转到setjmp函数时,由于之前已经保存上下文环境了,便不会保存,并且返回值是longjmp函数的第二个参数val(保证非0,val是0时会返回1)。...b.longjmp函数负责跳转到参数 env 中保存的上下文中去执行setjmp函数,并且返回值是longjmp的第二个参数val。
返回值r数值为VLIB_PROCESS_RETURN_LONGJMP_SUSPEND,不等于VLIB_PROCESS_RETURN_LONGJMP_RETURN执行else分支切换到dispatch_process...; p->flags |= VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_CLOCK; r = clib_setjmp (&p->resume_longjmp,...VLIB_PROCESS_RESUME_LONGJMP_SUSPEND); if (r == VLIB_PROCESS_RESUME_LONGJMP_SUSPEND) { /*...(&p->return_longjmp, VLIB_PROCESS_RETURN_LONGJMP_SUSPEND); } else vlib_process_finish_switch_stack..., VLIB_PROCESS_RETURN_LONGJMP_RETURN); if (r == VLIB_PROCESS_RETURN_LONGJMP_RETURN) { vlib_process_start_switch_stack
这时可以使用longjmp函数。longjmp函数和setjmp函数配合使用。...longjmp跳转到setjmp处。...setjmp直接调用返回0,若从longjmp返回,则为非0....如果我们希望里面任何一层出错了,就返回main函数,那么用longjmp就可以实现。...使用longjmp还有一个问题我们可能也需要关注一下,就是当使用longjmp返回的时候,函数里的那些变量还能保持原来的值吗?
: // setjmp.c // 非局部跳转测试用例 #include #include jmp_buf b; void jmp_test() { longjmp...longjmp() 的作用就是让程序的执行流回到当初setjmp()的时刻,并且返回由longjmp指定的返回值(第二个参数) 就好像让程序”时光倒流“。 当然,这绝对不是结构化编程。
const char *name); Returns: pointer to value associated with name, NULL if not found 4 setjmp和longjmp...函数 C语言种,goto是不能跨越函数的,而执行这类跳转功能的函数是setjmp和longjmp。...int setjmp(jmp_buf env); Returns: 0 if called directly, nonzero if returning from a call to longjmp...void longjmp(jmp_buf env, int val); 在要返回的地方调用setjmp。...参数env是一个特殊的类型jmp_buf ,它存储了调用longjmp所需要的用来恢复栈状态的所有信息。
例如: int func() { return 0; } 拓展:longjmp()/setjmp(): setjmp()和longjmp()是C语言中的两个非常重要的函数,它们可以实现非局部跳转的功能...当需要跳转时,调用longjmp(env, val); longjmp()函数声明如下: void longjmp(jmp_buf env, int val); longjmp()第一个参数就是...但此时setjmp()会返回longjmp()第二个参数val,而不是0。 jmp_buf env是setjmp和longjmp函数用来保存环境信息的结构体变量。...当需要非局部跳转时,调用longjmp(env, val)。longjmp函数第一个参数就是这个env。 longjmp通过env这个结构体,可以恢复到setjmp函数保存环境时的状态。...当然你可以把env可以看作是一个“传送令牌”,只要通过longjmp把令牌改了,他就重新传送到setjmp,然后继续执行,它连接setjmp和longjmp,使得longjmp能找到正确的环境信息进行跳转
3. volatile应用场景 1) 信号处理程序; 2) 与硬件打交道(嵌入式开发用得多); 3) 和setjmp、longjmp配合(请参见:http://www.cplusplus.com...5. setjmp和longjmp 在C/C++中,goto关键词只能函数内的局部跳转,函数间的跳转需要使用setjmp和longjmp,这也是有些协程库基于setjmp和longjmp实现的原因。...该函数的返回值比较特别,第一次返回0,第二次返回的longjmp第二个参数值(如果longjmp第二个参数值为0,则返回值为1,这样方便区分于第一次返回)。...2) longjmp 该函数从不返回,而是跳回到setjmp保存点,类似于swapcontext。如果没有先调用setjmp,则longjmp的行为是未定义的。..., scanf */ #include /* exit */ #include /* jmp_buf, setjmp, longjmp
对应文件src\vppinfra\longjmp.[hs]。 相关函数的定义是使用汇编语言写的。 每个process类型node是由jump机制构成的一个协程,协程主要用于等待、处理事件。...使用longjmp/setjmp的轻量级多任务协程,由应用进程自行进行调度,不受操作系统调度机制的影响,上下文切换只损耗调用longjmp/setjmp的时间。.... /* 跳转到setjmp设置点,reurn_value 就是跳转到clib—setjmp返回数值,*/ void clib_longjmp (clib_longjmp_t * save, uword...Returns given value if jump is not taken; otherwise returns value from clib_longjmp if long jump is...设置跳转返回点,默认返回*/ uword clib_setjmp (clib_longjmp_t * save, uword return_value_not_taken); /* 在设置的stack
= 0) 9 { 10 printf("%dn", b); 11 exit(0); 12 } 13 b = 5; 14 longjmp(...关键点在于理解setjmp以及longjmp,(http://en.wikipedia.org/wiki/Setjmp.h )第一次运行到setjmp,会设置jmp_buf,然后返回0。...当调用longjmp时,会把longjmp里面的非0值作为setjmp的返回值返回(如果longjmp的value参数为0,setjmp恢复后返回1,也就是当恢复到setjmp存储点的时候,setjmp...setjmp-longjmp组合的用处类似于游戏中的存盘读盘功能,经常被用于类似C++的异常恢复操作。
(3)使用C标准库中非局部跳转函数:setjmp()和longjmp()。...setjmp()函数可在程序中存储一典型的正常状态,如果程序发生错误,longjmp()可恢复setjmp()函数的设定状态,从而实现goto语句无法实现的“长跳转”。...参考下面的使用setjmp()和longjmp()实现“长跳转”的例子。...(){ Game game; for(int i=0;i<3;++i) cout<<"there is no interesting game"<<endl; longjmp...(2)以后调用longjmp(j,r)的效果就是一个非局部的goto跳转或“长跳转”,程序将跳转到由j描述的上下文处(也就是到那原来设置j的setjmp()处)。
上下文信息保存c 语言使用了jmp_buf 是 c 语言中用于实现非本地跳转,setjmp 函数可以用于保存调用环境信息longjmp 函数可以回复保存的调用环境setjmp 和 longjmp 函数setjmp...当通过 longjmp 跳转到此环境时,setjmp 返回一个非零值。...longjmp 函数:void longjmp(jmp_buf env, int val);该函数恢复 env 保存的调用环境,并导致 setjmp 返回 val。...frame->message, EXCEPTION_MESSAGE_LENGTH, cause, ap); //输出 va_end(ap);}ntyExceptionPopStack; //将异常出栈longjmp
领取专属 10元无门槛券
手把手带您无忧上云