C - getContext und SetContext 在函数中不起作用



我试图复制一个线程的上下文,包括堆栈来创建一个检查点,我可以稍后恢复。出于这个原因,我试图将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(),返回指令指针位于堆栈上,因此设置了所有寄存器的内容,但堆栈上的内容保持不变。

最新更新