侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 239 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

getcontext函数用法详解

noerror
2022-11-09 / 0 评论 / 0 点赞 / 148 阅读 / 911 字 / 正在检测是否收录...

getcontext函数用法详解

getcontext函数简介

  • 头文件包含
#include <ucontext.h>
  • 函数定义
int getcontext(ucontext_t * ucp );
int setcontext(const ucontext_t * ucp );

getcontext函数常见使用错误

  • 编译错误
    warning: implicit declaration of function ‘getcontext’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <ucontext.h>

getcontext函数详细描述

在类似System V的环境中,有在中定义的两种类型mcontext_t和ucontext_t,以及允许在进程内的多个控制线程之间进行用户级上下文切换的四个函数getcontext ()、setcontext ()、makecontext (3)和swapcontext (3)。
mcontext_t类型依赖于机器并且不透明。ucontext_t类型是至少具有以下字段的结构:

typedef struct ucontext_t {
   struct ucontext_t *uc_link;
   sigset_t          uc_sigmask;
   stack_t           uc_stack;
   mcontext_t        uc_mcontext;
   ...
} ucontext_t;

中定义了sigset_t和stack_t,这里uc_link指向当前上下文终止时将恢复的上下文(如果当前上下文是使用makecontext (3))创建的,uc_sigmask是在该上下文中阻塞的信号集(参见sigprocmask (2)),uc_stack是该上下文使用的堆栈(参见sigaltstack (2)),uc_mcontext是保存的上下文的特定于机器的表示,包括调用线程的机器寄存器)。
函数getcontext ()将ucp指向的结构初始化为当前活动的上下文。
函数setcontext ()恢复ucp 指向的用户上下文,成功的调用不会返回。上下文应该是通过调用getcontext ()或makecontext (3)获得的,或者作为信号处理程序的第三个参数接收的(参见sigaction (2))中关于SA_SIGINFO标志的讨论
如果上下文是通过调用getcontext ()获得的,程序继续执行,就好像这个调用刚刚返回一样。
如果上下文是通过调用makecontext (3)获得的,当函数func返回时,程序执行通过调用函数func继续,该函数PPPP1被指定为该调用makecontext (3)的第二个参数,我们继续使用结构ucp的uc_link成员,该成员被指定为该调用makecontext (3)的第一个参数。当该成员为空时,线程退出。
如果上下文是通过调用信号处理程序获得的,那么旧的标准文本说“程序执行继续,程序指令跟随被信号中断的指令”。但这句话在SUSv2中被删除,目前的判决是“结果不明”。

getcontext函数返回值

成功时,getcontext ()返回0,而setcontext ()不返回。出错时,两者都返回-1并适当地设置errno。

getcontext函数错误码

未定义。

getcontext函数其他说明

这种机制的最早化身是setjmp (3)/ longjmp (3)机制。因为这没有定义信号上下文的处理,所以下一阶段是sigsetjmp (3)/ siglongjmp (3)对。目前的机制提供了更多的控制。另一方面,没有简单的方法来检测来自getcontext ()的返回是来自第一个调用,还是通过setcontext ()调用。用户必须发明他们自己的簿记设备,而寄存器变量是不行的,因为寄存器是恢复的。
当一个信号出现时,当前用户上下文被保存,并且内核为信号处理程序创建一个新的上下文。不要使用longjmp (3):离开处理程序,它不确定上下文会发生什么。请改用siglongjmp (3)或setcontext ()。

0

评论区