chromium内核在创建render进程时用到了setjmp和longjmp,用法整理如下:
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
void test_longjmp(void)
{
printf("0000000001\n");
longjmp(buf, 4); <span style="color:#ff0000;"> // 重新执行setjump,并使得该函数返回值为4</span>
printf("0000000002\n"); <span style="color:#ff0000;">// 永远不会被执行到</span>
}
void main(void)
{
switch (setjmp(buf)) {
case 0:
printf("0000000000\n");
test_longjmp();
break;
case 1:
printf("1111111111\n");
break;
case 2:
printf("2222222222\n");
break;
case 3:
printf("3333333333\n");
break;
default:
printf("4444444444\n");
break;
}
}
xxxx@Lenovo:setjump$ ./a.out
0000000000
0000000001
4444444444参考:
http://blog.youkuaiyun.com/cscmaker/article/details/7584433
setjmp和longjmp是C语言所独有的,它们部分弥补了C语言有限的转移能力。
函数说明(来自wiki百科):
int setjmp(jmp_buf env) | 建立本地的jmp_buf缓冲区并且初始化,用于将来跳转回此处。这个子程序保存程序的调用环境于env参数所指的缓冲区,env将被longjmp使用。如果是从setjmp直接调用返回,setjmp返回值为0。如果是从longjmp恢复的程序调用环境返回,setjmp返回非零值。 |
void longjmp(jmp_buf env, int value) | 恢复env所指的缓冲区中的程序调用环境上下文,env所指缓冲区的内容是由setjmp子程序调用所保存。value的值从longjmp传递给setjmp。longjmp完成后,程序从对应的setjmp调用处继续执行,如同setjmp调用刚刚完成。如果value传递给longjmp零值,setjmp的返回值为1;否则,setjmp的返回值为value。 |
这种方法看起来与goto相似,但是是有区别的,区别如下:
(1)goto语句不能跳出C语言当前的函数。
(2)用longjmp只能跳回曾经到过的地方。在执行setjmp的地方仍留有一个过程活动记录。从这个角度上讲,longjmp更象是“从何处来”,而不是“要往哪去”。另外,longjmp接受一个额外的整形参数并返回它的值,这可以知道是由longjmp转移到这里的还是从上一条语句执行后自然执行到这里的。
setjmp/longjmp的最大的用途是错误处理,只要还没有从函数中返回,一旦发现一个不可恢复的错误,可以把控制转移到主输入循环,并从那里重新开始执行。
C++中的异常处理机制"catch"和"throw"与其类似。
本文详细介绍了C语言中的setjmp和longjmp函数如何在Chromium浏览器内核的render进程中使用,通过具体示例展示了这两个函数的工作原理及流程控制特点。
2789

被折叠的 条评论
为什么被折叠?



