我正在尝试复制包含堆栈的线程的上下文来创建一个检查点,我可以稍后恢复。出于这个原因,我试图将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”并退出。
现在我被卡住了。提前谢谢。
答案 0 :(得分:4)
一旦调用getcontext
的函数返回,保存的上下文无效。这些功能的文档中对此进行了解释。
答案 1 :(得分:0)
因为你使用堆栈指针地址,当函数结束时它会消失。请改用ucontext_t **
答案 2 :(得分:0)
使用getcontext()保存上下文时,所有寄存器等都存储在提供的上下文中。这确实意味着堆栈中的内容已保存-您只有一个堆栈。
当我们使用setcontext()时,将还原寄存器,但堆栈上的内容仍然相同。由于已调用set_context(),因此返回指令指针位于堆栈上,因此可以设置所有寄存器的内容,但堆栈上的内容保持不变。