我试图复制一个线程的上下文,包括堆栈来创建一个检查点,我可以稍后恢复。出于这个原因,我试图将getcontext和setcontext的调用移动到一个函数中,这个函数也保存了堆栈,但这不起作用。
来自维基百科的工作示例:
#include <stdio.h>
#include <ucontext.h>
#include <unistd.h>
int main(int argc, const char *argv[]){
ucontext_t context;
getcontext(&context);
puts("Hello world");
sleep(1);
setcontext(&context);
return 0;
}
这只是重复打印"Hello world"。
我想这样做:
#include <stdio.h>
#include <ucontext.h>
#include <unistd.h>
void set_context(ucontext_t * ct)
{
setcontext(ct);
}
void get_context(ucontext_t * ct)
{
getcontext(ct);
}
int main()
{
ucontext_t context;
get_context(&context);
puts("Hello world");
sleep(1);
set_context(&context);
return 0;
}
但是这只打印一次"Hello world"然后退出。
现在我被卡住了。
一旦调用getcontext
的函数返回,保存的上下文就无效。
因为你使用了一个堆栈指针地址,它会在函数结束时消失。使用ucontext_t **代替
当您使用getcontext()保存上下文时,所有寄存器等都存储在提供的上下文中。这意味着堆栈上的内容被保存——你只有一个堆栈。
当你调用setcontext()时,寄存器被恢复,但你的堆栈上仍然有相同的内容。由于调用了set_context(),返回指令指针位于堆栈上,因此设置了所有寄存器的内容,但堆栈上的内容保持不变。