getcontext和setcontext在函数中不起作用

时间:2013-06-05 22:35:00

标签: c linux ucontext

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

现在我被卡住了。提前谢谢。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

当我们使用setcontext()时,将还原寄存器,但堆栈上的内容仍然相同。由于已调用set_context(),因此返回指令指针位于堆栈上,因此可以设置所有寄存器的内容,但堆栈上的内容保持不变。