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类型是至少具有以下字段的结构:
typedef struct ucontext_t {
struct ucontext_t *uc_link;
sigset_t uc_sigmask;
stack_t uc_stack;
mcontext_t uc_mcontext;
...
} ucontext_t;
在
函数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 ()。
评论区