void longjmp(jmp_buf, int val)
Функция longjmp() вызывает продолжение исполнения программы, начиная с точки последнего вызова функции setjmp(). Эти две функции определяют способ переходов между функциями. longjmp() функционирует путем переустановки стека в состояние, определяемое параметром envbuf, который должен был быть предварительно установлен вызовом setjmp(). Это вызывает продолжение исполнения программы, начиная с инструкции, следующей за вызовом setjmp(). Тем самым компьютер как бы обманывают, заставляют думать, что он никогда не покидал функцию, вызвавшую setjmp().
Буфер envbuf имеет тип jmp_buf, определенный в заголовочном файле setjmp.h. Буфер должен был быть предварительно установлен посредством вызова setjmp(), предшествовавшего вызову функции longjmp().
Величина val становится возвращаемым значением функции setjmp() и может быть проанализирована с целью определения, откуда был совершен длинный переход. Единственным недопустимым значением является 0.
Важно понимать, что функция longjmp() должна быть вызвана перед выходом из функции, которая вызвала setjmp(). В противном случае результат технически не определен. (Фактически возникает аварийная ситуация.)
По существу наиболее употребительным использованием longjmp() является выход из глубоко вложенных процедур при возникновении фатальной ошибки.
#include <stdio.h>
#include <setjmp.h>
jmp_buf ebuf;
void f2(void);
int main(void)
{
char first=1;
int i;
printf("1 ");
i = setjmp(ebuf);
if (first) {
first =! first;
f2();
printf ("this will not be printed");
}
printf("%d", i);
return 0;
}
void f2(void)
{
printf("2 ");
longjmp(ebuf, 3);
}