我试图将getcontext调用到另一个函数中(而不是直接调用到main),以便复制线程的堆栈并在以后恢复它。这段代码应该反复打印,但是一旦调用getcontext的函数返回,它就不能工作了。
有没有办法绕过这个限制,在另一个函数中调用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;
}发布于 2021-01-03 18:35:34
getcontext只保存调用点的机器寄存器状态。它不将堆栈内存的内容存储在该位置。当您调用setcontext时,它会跳转从get_context执行代码,但是下一条指令会弹出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你想要做的事--继续--原则上可以这样做,但在实践中却行不通.也就是说,您将永远不会在这两个调用之间使用一个随机C程序来获得想要做的。而且,只是偶然的,你的测试没有导致车祸.( setcontext和getcontext都发生在堆栈顶部位于相同地址的地方)。
https://stackoverflow.com/questions/65553327
复制相似问题