> 文档中心 > ST源码分析-setjmp

ST源码分析-setjmp

C语言中的 goto 实现的是函数内部的跳转,也就是 local jump。但是 C 标准库还有 setjmp() 跟 longjmp() 实现不同函数的跳转。这种不同函数的跳转叫做 long jump。下面就来介绍 C标准库 的 setjmp() 跟 longjmp() 函数的使用。

请阅读文章,《 C语言中 setjmp 和 longjmp》。

示例代码:

#include #include 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


由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。QQ:2338195090。


推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:

Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

ST源码分析-setjmp 创作打卡挑战赛 ST源码分析-setjmp 赢取流量/现金/CSDN周边激励大奖