首页 / LINUX / linux ucontext族函数
linux ucontext族函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux ucontext族函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2015字,纯文字阅读大概需要3分钟。
内容图文
![linux ucontext族函数](/upload/InfoBanner/zyjiaocheng/942/796c85d2039f4b749f141d81576f00f0.jpg)
引言
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
...
内容总结
以上是互联网集市为您收集整理的linux ucontext族函数全部内容,希望文章能够帮你解决linux ucontext族函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。