sigsetjmp(3) сохраняет контекст стека при нелокальном переходе

Other Alias

setjmp

ОБЗОР

#include <setjmp.h>

int setjmp(jmp_buf env);
int sigsetjmp(sigjmp_buf env, int savesigs);

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

setjmp(): Смотрите ЗАМЕЧАНИЯ.
sigsetjmp(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_C_SOURCE

ОПИСАНИЕ

Функции setjmp() и longjmp(3) используются для работы с ошибками и прерываниями, встречающимися в подпрограммах низкого уровня. Функция setjmp() сохраняет стек контекста/окружения в env для дальнейшего его использования функцией longjmp(3). Стек контекста будет недействительным, если функция, вызвавшая setjmp(), завершит работу.

Функция sigsetjmp() идентична setjmp(). Если значение savesigs не равно нулю, то текущая маска сигналов процесса сохраняется в env и будет восстановлена, если позднее будет запущена siglongjmp() с этим env.

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

Функции setjmp() и sigsetjmp() возвращают 0 при непосредственном выходе и ненулевое значение при выходе из longjmp(3) или siglongjmp(3) с использованием сохранённого контекста.

АТРИБУТЫ

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

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

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

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

ЗАМЕЧАНИЯ

В POSIX не уточняется, должна ли setjmp() сохранять сигнальную маску (чтобы позднее восстановить её при longjmp(3)). В System V — не должна. В 4.3BSD сохранение выполняется, хотя в имеющейся функции _setjmp этого не происходит. В Linux с glibc до версии 2.19 функция setjmp() по умолчанию ведёт себя как System V, но можно включить поведение как BSD, если определить макрос тестирования свойств _BSD_SOURCE и будут не определены _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED, _GNU_SOURCE или _SVID_SOURCE. Начиная с glibc 2.19, в <setjmp.h> представляет только версию System V для setjmp(). Если в программе нужно задействовать семантику BSD, то замените вызовы setjmp() на вызовы sigsetjmp() с ненулевым аргументом savesigs.

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

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