头文件<setjmp.h>定义了宏setjmp,并且为了绕过正常的函数调用和返回规则声明了一个函数和一个类型。 1、类型jmp_buf 它是一个数组类型,适合存储恢复一个调用环境所需的信息。 2、宏setjmp int setjmp(jmp_buf env); 说明:宏setjmp将它的调用环境保存 ...
分类:
其他好文 时间:
2017-07-21 23:14:17
阅读次数:
205
int setjmp(jmp_buf env):函数会保存当前执行环境,初次调用时会返回0值;在调用链中如果遇到void long_jmp(jmp_buf env, int value)时会返回该处,并取得value值。 与goto相比,longjmp可以实现函数间的跳转,goto只能在函数内部跳转 ...
分类:
其他好文 时间:
2017-07-03 14:08:05
阅读次数:
134
仿制云风的协程库的接口设计,我花了一个下午加晚上的时间重构了之前写的协程库,提供的接口现在和云风大大的协程接口一模一样,都是仿制lua的非对称协程。我们依旧没有用ucontext.h组件(用ucontext.h组件实现协程的文章铺天盖地,可以自行寻找,用longjmp实现就少很多,用内联汇编实现的就 ...
分类:
编程语言 时间:
2017-06-23 13:07:27
阅读次数:
218
例1 volatile提醒编译器它后面所定义的变量随时都有可能改变。因此编译后的程序每次须要存储或读取这个变量的时候,都会直接从变量地址中读取数据。假设没有volatile关键字。则编译器可能优化读取和存储。可能临时使用寄存器中的值。假设这个变量由别的程序更新了的话,将出现不一致的现象。 以下举例说 ...
分类:
其他好文 时间:
2017-06-16 22:02:42
阅读次数:
269
共15个,请查看,在linux下的目录位/usr/share/include locale.h math.h setjmp.h signal.h stdarg.h stddef.h stdio.h stdlib.h string.h time.h ...
分类:
编程语言 时间:
2017-06-13 21:49:36
阅读次数:
262
1 在proc.c的scheduler函数中,有两行: if(setjmp(&cpus[cpu()].jmpbuf) == 0) longjmp(&p->jmpbuf); 把它修改为: cprintf("setjmp called in scheduler\n"); if(setjmp(&cpus[ ...
分类:
编程语言 时间:
2017-05-17 10:24:49
阅读次数:
716
轮子年年有人造,我们也来凑热闹,参考协程实现,大概有以下几种方法: 1)利用setjmp,longjmp 2)利用ucontext接口函数 3)汇编 (线程无非就是多了个抢占功能,由定时器触发,而非自愿让出运行权限) 因为我写的时候还没看到其他帖子,如果看到了,铁定会用最直观的ucontext接口写 ...
分类:
编程语言 时间:
2017-05-13 16:58:32
阅读次数:
254
由于在信号处理期间自动屏蔽了正在被处理的信号,而使用setjmp/longjmp跳出信号处理程序时又不会自动将 信号屏蔽码修改会原来的屏蔽码,从而引起该信号被永久屏蔽。 可以使用sigsetjmp/siglongjmp来解决这一问题。 int sigsetjmp(sigjmp_buf env, in ...
分类:
其他好文 时间:
2017-04-10 18:42:21
阅读次数:
294
6. 非局部跳转 (1)setjmp和longjmp语句 头文件 #include<setjmp.h> 函数 int* setjmp(jum_buf env); 返回值 直接调用返回0,若从longjmp调用返回则返回非0值 功能 设置非局部跳转的跳转点 函数 void longjmp(jmp_bu ...
分类:
系统相关 时间:
2017-01-28 21:15:49
阅读次数:
323
在信号处理程序中经常调用longjmp函数以返回到程序的主循环中,而不是从该处理程序返回。 但是,调用longjmp有一个问题。当捕捉到一个信号时,进入信号捕捉函数,此时当前信号被自动地加到进程的信号屏蔽字中。这阻止了后来产生的这种信号中断该信号处理程序。(仅当从信号捕捉函数返回时再将进程的信号屏蔽 ...
分类:
其他好文 时间:
2017-01-28 15:53:29
阅读次数:
226