如何从函数内部调用 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 都发生在堆栈顶部位于同一地址的地方)。
我正在尝试将 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 都发生在堆栈顶部位于同一地址的地方)。