siglongjmp(3) нелокальный прыжок к сохраненному контексту стека

Other Alias

longjmp

ОБЗОР

#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).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Данные функции не возвращают управление.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
ИнтерфейсАтрибутЗначение
longjmp(), siglongjmp() безвредность в нитяхбезвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

longjmp(): POSIX.1-2001, POSIX.1-2008, C89, C99.

siglongjmp(): POSIX.1-2001, POSIX.1-2008.

ЗАМЕЧАНИЯ

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

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

  • они локальны для функции, которая сделала соответствующий вызов setjmp(3);
  • их значения изменились между вызовами setjmp(3) и longjmp(); и
  • они не объявлены как volatile.

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

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