如何从函数内部调用 ucontext.h getcontext

How to call ucontext.h getcontext from inside a function

我正在尝试将 getcontext 调用到另一个函数中(而不是直接将其调用到 main 中)以便复制线程的堆栈并稍后恢复它。这段代码应该重复打印,但是一旦调用了 getcontext returns.

的函数,它就不会工作了

有没有办法绕过此限制并在另一个函数(内联宏除外)中调用 getcontext?

#include <stdio.h>
#include <ucontext.h>
#include <unistd.h>

ucontext_t context;

void set_context() {
    setcontext(&context);
}

void get_context() {
    getcontext(&context);
}

int main() {
    get_context();
    puts("Hello world");
    sleep(1);
    set_context();
    return 0;
}

getcontext 仅保存调用点的 机器寄存器状态 。它不会在该位置存储堆栈内存的内容。当你调用 setcontext 然后它 确实 跳转执行来自 get_context 的代码但是下一条指令然后弹出 return 地址 set_context 电话:

#include <stdio.h>
#include <ucontext.h>
#include <unistd.h>

ucontext_t context;

void set_context() {
    puts("Calling setcontext");
    setcontext(&context);
    puts("Returned from setcontext");
}

void get_context() {
    puts("Calling getcontext");
    getcontext(&context);
    puts("Returned from getcontext");
}

int main() {
    get_context();
    puts("Hello world");
    sleep(1);
    set_context();
    return 0;
}

输出:

Calling getcontext
Returned from getcontext
Hello world
Calling setcontext
Returned from getcontext

你想做的事情 - 延续 - 可以通过这种方式完成原则上,但他们只是行不通在实践中 ... IE。不,您将永远 得到您想在这两个调用之间使用随机 C 程序执行的操作。此外,您的测试没有导致崩溃只是偶然...(setcontext 和 getcontext 都发生在堆栈顶部位于同一地址的地方)。