getcontext и setcontext не будут работать в функциях
Я пытаюсь скопировать контекст потока, включая стек, чтобы создать контрольную точку, которую я могу восстановить позже. По этой причине я попытался переместить вызов 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;
}
Это просто повторяет печать "Привет, мир".
Я хотел бы сделать что-то вроде:
#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" один раз и выходит.
Теперь я застрял. Заранее спасибо.
2 ответа
Сохраненный контекст недействителен, если функция, которая вызвала getcontext
возвращается. Это объясняется в документации по этим функциям.
Потому что вы используете адрес указателя стека, который исчезнет после завершения функции. Используйте взамен ucontext_t **
Когда вы сохраняете контекст с помощью getcontext(), все регистры и т. Д. Сохраняются в предоставленном контексте. Это означает, что содержимое стека сохраняется - у вас только один стек.
Когда вы используете setcontext(), регистры восстанавливаются, но в вашем стеке остается то же содержимое. Поскольку вы выполнили вызов set_context(), указатель инструкции возврата находится в стеке, вы устанавливаете содержимое всех регистров, но содержимое стека остается прежним.