.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (C) 2016 Michael Kerrisk .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH setjmp 3 "20 июля 2023 г." "Linux man\-pages 6.05.01" .SH ИМЯ setjmp, sigsetjmp, longjmp, siglongjmp \- выполняет нелокальный переход .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .PP \fBint setjmp(jmp_buf \fP\fIenv\fP\fB);\fP \fBint sigsetjmp(sigjmp_buf \fP\fIenv\fP\fB, int \fP\fIsavesigs\fP\fB);\fP .PP \fB[[noreturn]] void longjmp(jmp_buf \fP\fIenv\fP\fB, int \fP\fIval\fP\fB);\fP \fB[[noreturn]] void siglongjmp(sigjmp_buf \fP\fIenv\fP\fB, int \fP\fIval\fP\fB);\fP .fi .PP .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .PP \fBsetjmp\fP(): смотрите ЗАМЕЧАНИЯ. .PP \fBsigsetjmp\fP(): .nf _POSIX_C_SOURCE .fi .SH ОПИСАНИЕ Функции, описываемые в этой странице, используются для выполнения «нелокального goto»: передачи исполнения из одной функции в заранее определённое место другой. Функция \fBsetjmp\fP() динамически устанавливает точку для будущей передачи исполнения, а \fBlongjmp\fP() выполняет передачу исполнения. .PP Функция \fBsetjmp\fP() сохраняет различную информацию об окружении вызова (обычно, указатель стека, указатель инструкции, значения других регистров и маску сигналов) в буфер \fIenv\fP для последующего использования в \fBlongjmp\fP(). В этом случае \fBsetjmp\fP() возвращает 0. .PP Функция \fBlongjmp\fP() использует информацию, сохранённую в \fIenv\fP, для передачи управления обратно в точку, откуда была вызвана \fBsetjmp\fP(), и восстанавливает («отматывает») стек до состояния на время вызова \fBsetjmp\fP(). Также, в зависимости от реализации (смотрите ЗАМЕЧАНИЯ), значения некоторых регистров маска сигналов процесса могут быть восстановлены в их состояние на момент вызова \fBsetjmp\fP(). .PP После успешного вызова \fBlongjmp\fP() выполнение продолжается как если бы \fBsetjmp\fP() была вызвана второй раз. Этот «фиктивный» возврат можно распознать от настоящего вызова \fBsetjmp\fP(), так как «фиктивный» возврат возвращает значение, указанное в \fIval\fP. Если программист ошибочно передаст значение 0 в \fIval\fP, то «фиктивный» возврат вернёт вместо него 1. .SS "sigsetjmp() и siglongjmp()" Функции \fBsigsetjmp\fP() и \fBsiglongjmp\fP() также выполняют нелокальные переходы, но предоставляют предсказуемую обработку сигнальной маски процесса. .PP Если, и только если, аргумент \fIsavesigs\fP, передаваемый в \fBsigsetjmp\fP(), не равен нулю, то текущая маска сигналов процесса сохраняется в \fIenv\fP и будет восстановлена, если позднее будет запущена \fBsiglongjmp\fP() с этим \fIenv\fP. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" Функции \fBsetjmp\fP() и \fBsigsetjmp\fP() возвращают 0, если вызывают явно; при «фиктивном» возврате, который возникает после \fBlongjmp\fP() или \fBsiglongjmp\fP(), возвращается ненулевое значение, указанное в \fIval\fP. .PP Функции \fBlongjmp\fP() и \fBsiglongjmp\fP() не выполняют возврат. .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBsetjmp\fP(), \fBsigsetjmp\fP() T} Безвредность в нитях MT\-Safe T{ .na .nh \fBlongjmp\fP(), \fBsiglongjmp\fP() T} Безвредность в нитях MT\-Safe .TE .sp 1 .SH СТАНДАРТЫ .TP \fBsetjmp\fP() .TQ \fBlongjmp\fP() C11, POSIX.1\-2008. .TP \fBsigsetjmp\fP() .TQ \fBsiglongjmp\fP() POSIX.1\-2008. .SH ИСТОРИЯ .TP \fBsetjmp\fP() .TQ \fBlongjmp\fP() POSIX.1\-2001, C89. .TP \fBsigsetjmp\fP() .TQ \fBsiglongjmp\fP() POSIX.1\-2001. .PP .\" so that _FAVOR_BSD is triggered .\" .BR _XOPEN_SOURCE_EXTENDED , POSIX does not specify whether \fBsetjmp\fP() will save the signal mask (to be later restored during \fBlongjmp\fP()). In System V it will not. In 4.3BSD it will, and there is a function \fB_setjmp\fP() that will not. The behavior under Linux depends on the glibc version and the setting of feature test macros. Before glibc 2.19, \fBsetjmp\fP() follows the System V behavior by default, but the BSD behavior is provided if the \fB_BSD_SOURCE\fP feature test macro is explicitly defined and none of \fB_POSIX_SOURCE\fP, \fB_POSIX_C_SOURCE\fP, \fB_XOPEN_SOURCE\fP, \fB_GNU_SOURCE\fP, or \fB_SVID_SOURCE\fP is defined. Since glibc 2.19, \fI\fP exposes only the System V version of \fBsetjmp\fP(). Programs that need the BSD semantics should replace calls to \fBsetjmp\fP() with calls to \fBsigsetjmp\fP() with a nonzero \fIsavesigs\fP argument. .SH ЗАМЕЧАНИЯ Функции \fBsetjmp\fP() и \fBlongjmp\fP() можно использовать для обработки ошибок внутри глубоко вложенных вызовов функций или чтобы позволить обработчику сигналов передать управление в определённую точку программы, и не возвращать исполнение главной программе в точку прерывания обработчиком. В последнем случае, если вы хотите сохранить и восстановить маску сигналов переносимым образом, то используйте \fBsigsetjmp\fP() и \fBsiglongjmp\fP(). Также смотрите раздел про читаемость программы далее. .SH CAVEATS Компилятор может оптимизировать переменные в регистрах и \fBlongjmp\fP() может восстановить значения регистров помимо указателя стека и счётчика программы. Следовательно, значения автоматических переменных непредсказуемы после вызова \fBlongjmp\fP(), если они удовлетворяют следующим критериям: .IP \[bu] 3 они локальны для функции, которая сделала соответствующий вызов \fBsetjmp\fP(); .IP \[bu] их значения изменились между вызовами \fBsetjmp\fP() и \fBlongjmp\fP(); и .IP \[bu] они не объявлены как \fIvolatile\fP. .PP .\" Аналогичные замечания относятся и к \fBsiglongjmp\fP(). .SS "Нелокальные переходы и читаемость программы" Хотя этим и можно злоупотребить, обычный оператор C «goto» имеет преимущество в виде лексических отметок (оператор goto и метка перехода), которые позволяют программисту легко понять поток выполнения. Нелокальные переходы не имеют таких отметок: многократные вызовы \fBsetjmp\fP() могут использовать одну переменную \fIjmp_buf\fP, то есть контекст переменной может изменяться на протяжении времени работы приложения. Следовательно, программисту придёт вчитываться в код для определения динамической точки перехода определённого вызова \fBlongjmp\fP() (для облегчения жизни программиста в каждом вызове \fBsetjmp\fP() должна использоваться уникальная переменная \fIjmp_buf\fP). .PP Дополнительная сложность: вызовы \fBsetjmp\fP() и \fBlongjmp\fP() даже могут быть в разных модулях исходного кода. .PP .\" Таким образом, нелокальные переходы могут сделать программу тяжелее для понимания и поддержки, и, если это возможно, нужно использовать альтернативные варианты. .SS "Undefined Behavior" Если функция, вызвавшая \fBsetjmp\fP() завершилась до вызова \fBlongjmp\fP(), то поведение не определено. Результатом может стать маленький (или не очень) хаос. .PP .\" .\" The following statement appeared in versions up to POSIX.1-2008 TC1, .\" but is set to be removed in POSIX.1-2008 TC2: .\" .\" According to POSIX.1, if a .\" .BR longjmp () .\" call is performed from a nested signal handler .\" (i.e., from a handler that was invoked in response to a signal that was .\" generated while another signal was already in the process of being .\" handled), the behavior is undefined. Если в многонитевой программе вызов \fBlongjmp\fP() использует буфер \fIenv\fP, инициализированный вызовом \fBsetjmp\fP() в другой нити, то поведение не определено. .PP .\" http://austingroupbugs.net/view.php?id=516#c1195 В POSIX.1\-2008 Technical Corrigendum 2 вызовы \fBlongjmp\fP() и \fBsiglongjmp\fP() добавлены в список функций async\-signal\-safe. Однако стандарт рекомендует избегать использования этих функций в обработчиках сигналов и указывает, что если эти функции вызваны из обработчика сигналов, который прервал вызов функции не async\-signal\-safe (или её эквивалент, например шагам \fBexit\fP(3), который возникают при возврате из начального вызова \fImain\fP()), то поведение не определено, если программа далее вызывает функцию не async\-signal\-safe. Единственным способом избежать неопределённого поведения, является проверка следующего: .IP \[bu] 3 После длинного перехода из обработчика сигналов программа не вызывает каких\-либо функций не async\-signal\-safe и не возвращается из первоначального вызова в \fImain\fP(). .IP \[bu] Любой сигнал, чей обработчик выполняет длинный переход, должен быть заблокирован на время \fIкаждого\fP вызова функции не async\-signal\-safe и не вызывать функции не async\-signal\-safe после возврата из начального вызова в \fImain\fP(). .SH "СМ. ТАКЖЕ" \fBsignal\fP(7), \fBsignal\-safety\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexander Golubev , Azamat Hackimov , Hotellook, Nikita , Spiros Georgaras , Vladislav , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .