标签:函数 ucp getcontext context linux ucontext 上下文 uc
引言
ucontext使得linux程序可以在用户态执行上下文切换,从而避免了进程或者线程切换导致的切换用户空间、切换堆栈,因此,效率相对更高。
结构体
有两个结构体,分别是mcontext_t
和ucontext_t
,其中mcontext_t
是透明的。我们只需要关注ucontext_t
就可以了
ucontext_t
定义在头文件ucontext.h
中,为:
/* Userlevel context. */
typedef struct ucontext_t
{
unsigned long int __ctx(uc_flags);
struct ucontext_t *uc_link;
stack_t uc_stack;
mcontext_t uc_mcontext;
sigset_t uc_sigmask;
struct _libc_fpstate __fpregs_mem;
} ucontext_t;
关键字段说明:
uc_link
:当前context执行结束之后要执行的下一个context,如果uc_link
为空,执行完当前context后退出程序。
uc_stack
:上下文所需要的stack。
uc_sigmask
:执行上下文过程中,要屏蔽的信号集合,即信号掩码。
uc_mcontext
:保存具体的程序执行上下文,如PC值、堆栈指针和寄存器的值。它的实现依赖于底层,是硬件平台相关的,因此不透明。
函数
一共有四个函数:
int getcontext(ucontext_t *ucp);
初始化ucp
结构体,将当前上下文保存在ucp
中。成功时,返回0,错误返回-1,并设置errno
int setcontext(const ucontext_t *ucp);
设置当前上下文为ucp
所指向的上下文。setcontext
的上下文ucp
应该通过getcontext
或者makecontext
取得。如果程序是通过getcontext
取得,则程序会继续执行这个调用。如果context是通过makecontext
取得,则程序调用makecontext
函数的第二个参数指向的函数,这时,如果函数返回,则恢复ucp->uc_link,如果ucp->uc_link为空,退出线程。成功调用时,就切换到了新的context,不返回。失败返回-1。
void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...);
初始化一个ucontext_t,通过修改getcontext
取得的上下文(所以makecontext
之前需要调用getcontext
),设置栈空间uc_stack
和后续的上下文uc_link
。
int swapcontext(ucontext_t *oucp, const ucontext_t *ucp);
保存当前上下文到oucp
结构体,然后激活ucp
结构体。成功时不返回,失败返回-1
实例
#include <stdio.h>
#include <ucontext.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
int main()
{
ucontext_t context;
if (getcontext(&context))
{
perror("getcontext");
return -1;
}
puts("hello");
sleep(1);
if (setcontext(&context))
{
perror("setcontext");
return -1;
}
return 0;
}
输出为:
hello
hello
hello
...
标签:函数,ucp,getcontext,context,linux,ucontext,上下文,uc 来源: https://www.cnblogs.com/zuofaqi/p/12347759.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。