2

我正在尝试复制一个线程的上下文,包括堆栈以创建一个检查点,稍后我可以恢复该检查点。出于这个原因,我试图将 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”并退出。

现在我被困住了。提前致谢。

4

3 回答 3

4

一旦调用的函数getcontext返回,保存的上下文就无效了。这些功能的文档中对此进行了解释。

于 2013-06-05T22:40:41.177 回答
0

因为你使用了一个堆栈指针地址,当函数结束时它会消失。改用 ucontext_t **

于 2017-02-15T04:44:28.780 回答
0

当您使用 getcontext() 保存上下文时,所有寄存器等都存储在提供的上下文中。这确实意味着堆栈上的内容被保存了——你只有一个堆栈。

当您使用 setcontext() 时,寄存器会恢复,但您的堆栈上仍然有相同的内容。由于您调用了 set_context(),返回指令指针位于堆栈上,因此您设置了所有寄存器的内容,但堆栈上的内容保持不变。

于 2019-12-05T06:59:58.980 回答