linux ucontext族函数
作者:互联网
引言
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