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(), указатель инструкции возврата находится в стеке, вы устанавливаете содержимое всех регистров, но содержимое стека остается прежним.

Другие вопросы по тегам