首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从函数内部调用ucontext.h getcontext

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

Stack Overflow用户
提问于 2021-01-03 18:19:49
回答 1查看 156关注 0票数 1

我试图将getcontext调用到另一个函数中(而不是直接调用到main),以便复制线程的堆栈并在以后恢复它。这段代码应该反复打印,但是一旦调用getcontext的函数返回,它就不能工作了。

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

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-03 18:35:34

getcontext只保存调用点的机器寄存器状态。它不将堆栈内存的内容存储在该位置。当您调用setcontext时,它会跳转从get_context执行代码,但是下一条指令会弹出set_context调用的返回地址:

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
Calling getcontext
Returned from getcontext
Hello world
Calling setcontext
Returned from getcontext

你想要做的事--继续--原则上可以这样做,但在实践中却行不通.也就是说,您将永远不会在这两个调用之间使用一个随机C程序来获得想要做的。而且,只是偶然的,你的测试没有导致车祸.( setcontext和getcontext都发生在堆栈顶部位于相同地址的地方)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65553327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档