LONGJMP(3)

ИМЯ
longjmp, siglongjmp - нелокальный прыжок к сохраненному контексту стека

ОБЗОР
#include <setjmp.h>
void longjmp(jmp_buf env, int val);
void siglongjmp(sigjmp_buf env, int val);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

siglongjmp(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_C_SOURCE

ОПИСАНИЕ
Функции longjmp() и setjmp(3) полезны при работе с ошибками и прерываниями, встречающимися при выполнении низкоуровневых программных процедур. Функция longjmp() восстанавливает окружение, сохранённое последним вызовом setjmp(3), с соответствующим параметром env. После того, как завершится выполнение функции longjmp(), выполнение программы продолжится с того места, где соответствующий вызов setjmp(3) возвратил значение val. Функция longjmp() никогда не возвратит 0. Если longjmp() запускается со вторым параметром, равным 0, то возвращается 1.

Функция siglongjmp() подобна longjmp(), но имеет другой тип аргумента env. Если функция sigsetjmp(3) вызывалась для заполнения env и значение флага savesigs не равнялось 0, то siglongjmp() также восстановит сигнальную маску, сохранённую sigsetjmp(3).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Данные функции не возвращают управление.

СООТВЕТСТВИЕ СТАНДАРТАМ
Функция longjmp() описана в C89, C99 и POSIX.1-2001. В POSIX.1-2001 определена функция siglongjmp().

ЗАМЕЧАНИЯ
В POSIX не определяется, будет ли longjmp восстанавливать содержание контекста сигнала (смотрите setjmp(3)). Если вы хотите сохранять и восстанавливать маску сигналов переносимым способом, то используйте sigsetjmp(3) и siglongjmp().

Значения автоматических переменных не определены после вызова longjmp(), если они удовлетворяют всем критериям:

•   они локальны для функции, которая сделала соответствующий вызов setjmp(3);

•   их значения изменились между вызовами setjmp(3) и longjmp(); и

•   они не объявлены как volatile.

Аналогичные замечания относятся и к siglongjmp().

Функции longjmp() и siglongjmp() делают программы трудными для восприятия и дальнейшей поддержки. По возможности используйте в работе другие методы.

СМОТРИТЕ ТАКЖЕ
setjmp(3), sigsetjmp(3)