上下文切换 – ucontext_t和makecontext()
发布时间:2020-12-16 09:50:12 所属栏目:百科 来源:网络整理
导读:我正在研究C编程中的上下文切换,并在Internet上找到了以下示例代码.我试图弄清楚是否只有makecontext()函数可以触发一个做某事的函数.其他函数(如setcontext(),getcontext()和swapcontext())用于设置上下文. makecontext()将一个函数及其参数附加到一个上下
我正在研究C编程中的上下文切换,并在Internet上找到了以下示例代码.我试图弄清楚是否只有makecontext()函数可以触发一个做某事的函数.其他函数(如setcontext(),getcontext()和swapcontext())用于设置上下文.
makecontext()将一个函数及其参数附加到一个上下文,该函数是否一直坚持上下文,直到更改提交给它为止? 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <ucontext.h> 4 #define MEM 64000 5 6 ucontext_t T1,T2,Main; 7 ucontext_t a; 8 9 int fn1() 10 { 11 printf("this is from 1n"); 12 setcontext(&Main); 13 } 14 15 void fn2() 16 { 17 printf("this is from 2n"); 18 setcontext(&a); 19 printf("finished 1n"); 20 } 21 22 void start() 23 { 24 getcontext(&a); 25 a.uc_link=0; 26 a.uc_stack.ss_sp=malloc(MEM); 27 a.uc_stack.ss_size=MEM; 28 a.uc_stack.ss_flags=0; 29 makecontext(&a,(void*)&fn1,0); 30 } 31 32 int main(int argc,char *argv[]) 33 { 34 start(); 35 getcontext(&Main); 36 getcontext(&T1); 37 T1.uc_link=0; 38 T1.uc_stack.ss_sp=malloc(MEM); 39 T1.uc_stack.ss_size=MEM; 40 makecontext(&T1,0); 41 swapcontext(&Main,&T1); 42 getcontext(&T2); 43 T2.uc_link=0; 44 T2.uc_stack.ss_sp=malloc(MEM); 45 T2.uc_stack.ss_size=MEM; 46 T2.uc_stack.ss_flags=0; 47 makecontext(&T2,(void*)&fn2,0); 48 swapcontext(&Main,&T2); 49 printf("completedn"); 50 exit(0); 51 } 解决方法
makecontext将函数info写入上下文,它将保留在那里直到被其他东西覆盖. getcontext覆盖整个上下文,因此会覆盖先前调用makecontext所写的任何函数.同样,swapcontext完全覆盖其第一个参数指向的上下文.
基本思想是u_context在某个时间包含部分进程上下文的快照.它包含所有机器寄存器,堆栈信息和信号掩码.它不包含任何内存映射或文件描述符状态. u_context中的状态恰好是为了实现线程或协同程序而需要操作的所有状态. 编辑 swapcontext(& current,& another)将当前上下文保存在current中并切换到另一个.稍后,代码(从另一个上下文运行)可以切换回当前(另一个调用swapcontext),或者它可能切换到某个第三个上下文.当上下文结束时(使用makecontext返回设置的函数),如果uc_link字段指向某个上下文,它将切换到该上下文.但是如果uc_link是NULL,那么线程(并且如果只有一个线程则处理)将退出 – 其他未运行的上下文将被放弃. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |