本文主要是介绍ST源码分析-setjmp,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SRS 的社群来了,想加入微信社群的朋友请购买《SRS原理》电子书,里有更高级的内容与答疑服务。
C语言中的 goto
实现的是函数内部的跳转,也就是 local jump。但是 C 标准库还有 setjmp()
跟 longjmp()
实现不同函数的跳转。这种不同函数的跳转叫做 long jump。下面就来介绍 C标准库 的 setjmp()
跟 longjmp()
函数的使用。
请阅读文章,《 C语言中 setjmp 和 longjmp》。
示例代码:
#include <setjmp.h>
#include <stdio.h>
int main(){jmp_buf env;int i;
i = setjmp(env);printf("i = %d\n",i);if( i != 0 ){return 0;}
longjmp(env,2);printf("This line does not get printed \r\n");
}
编译命令:
gcc -o test test.c
虽然 C标准库 setjmp()
跟 longjmp()
可以实现不同函数间的跳转,但是 State-thread 库并没有采样 C 标准库的函数,而是自己用汇编实现了 setjmp
跟 longjmp
。原因有以下几点:
1,因为C标准库的 setjmp/longjmp
对栈信息的支持有限,所以 他们不能作为协程实现的底层机制。
2,jmpbuf
在不同平台的实现不同,有的可能都没有。所以作者选择了自己来实现这个 jmpbuf
,以及对应的 setjmp/longjmp
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。
这篇关于ST源码分析-setjmp的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!