setjmp и longjmp - понимание с примерами - PullRequest
7 голосов
/ 31 июля 2011

Я знаю определения setjmp и longjmp.setjmp сохраняет окружение в контексте стека, а другой восстанавливает.

Но я думаю, что с моей стороны что-то не хватает понимания.Может ли кто-нибудь объяснить мне, с помощью хороших примеров, как я могу заверить, и как он будет сохранен и как он будет восстановлен?

Я видел множество регистров процессора, указанных в jmp_buf.Но как я могу гарантировать, что он восстановлен?

Пожалуйста, помогите мне объяснить с аккуратными примерами.Я погуглил и сослался на другие вопросы с переполнением стека, но ни один из них не дает четких примеров.

Огромное огромное спасибо заранее.

PS: Это должно быть только из контекста Linux / Unix.

1 Ответ

7 голосов
/ 31 июля 2011

При вызове longjmp() все эти регистры восстанавливаются автоматически, и выполнение продолжается при соответствующем вызове setjmp(), но на этот раз setjmp() имеет другое возвращаемое значение (аналогично тому, как fork() имеет разные возвращаемые значения у родителей и ребенка).

setjmp() / longjmp() сохранить только ограниченную среду. В частности, они просто сохраняют указатель стека, а не полный стек, поэтому вы можете вернуться только к той же функции или к вызывающей функции. POSIX имеет setcontext(), что позволяет переключаться между стеками, что делает его более полезным для реализации таких вещей, как потоки пользовательского пространства (fibrils, green-threads, ...).

...