.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (c) 2001, 2017 Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" aeb, various minor fixes .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH sigaltstack 2 "20 июля 2023 г." "Linux man\-pages 6.05.01" .SH ИМЯ sigaltstack \- считывает или устанавливает расположение стека сигналов .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .PP \fBint sigaltstack(const stack_t *_Nullable restrict \fP\fIss\fP\fB,\fP \fB stack_t *_Nullable restrict \fP\fIold_ss\fP\fB);\fP .fi .PP .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .PP \fBsigaltstack\fP(): .nf .\" || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED _XOPEN_SOURCE >= 500 || /* начиная с glibc 2.12: */ _POSIX_C_SOURCE >= 200809L || /* glibc <= 2.19: */ _BSD_SOURCE .fi .SH ОПИСАНИЕ \fBsigaltstack\fP() allows a thread to define a new alternate signal stack and/or retrieve the state of an existing alternate signal stack. An alternate signal stack is used during the execution of a signal handler if the establishment of that handler (see \fBsigaction\fP(2)) requested it. .PP Обычный порядок действий для использования альтернативного стека сигналов: .TP 3 1. Выделить область памяти, которая будет использована под альтернативный стек сигналов. .TP 2. Вызвать \fBsigaltstack\fP() для информирования системы о существовании и расположении альтернативного стека сигналов. .TP 3. При установке обработчика сигналов с помощью \fBsigaction\fP(2) (флагом \fBSA_ONSTACK\fP) сообщить системе, что обработчик сигналов должен выполняться с альтернативным стеком сигналов. .PP Аргумент \fIss\fP используется для указания нового альтернативного стека сигналов, а аргумент \fIold_ss\fP используется для получения информации об установленном в данный момент стеке сигналов. Если интересует какая\-то одна из этих задач, то другой аргумент указывается как NULL. .PP Тип \fIstack_t\fP, используемый для аргументов этой функции, определён следующим образом: .PP .in +4n .EX typedef struct { void *ss_sp; /* базовый адрес стека */ int ss_flags; /* флаги */ size_t ss_size; /* количество байт в стеке */ } stack_t; .EE .in .PP Для организации нового альтернативного стека сигналов поля этой структуры должны быть заполнены следующим образом: .TP \fIss.ss_flags\fP В этом поле содержится 0 или следующий флаг: .RS .TP \fBSS_AUTODISARM\fP (начиная с Linux 4.7) .\" commit 2a74213838104a41588d86fd5e8d344972891ace .\" See tools/testing/selftests/sigaltstack/sas.c in kernel sources Очистить настройки альтернативного стека сигналов в записи обработчика сигналов. Когда происходит возврат из обработчика сигналов, восстанавливаются предыдущие настройки альтернативного стека сигналов. .IP Этот флаг был добавлен для безопасного переключения из обработчика сигналов с помощью \fBswapcontext\fP(3). Без этого флага следующий обрабатываемый сигнал повредит состояние обработчика сигналов, в который выполняется переключение (switched\-away). В ядрах без поддержки этого флага вызов \fBsigaltstack\fP() завершается ошибкой \fBEINVAL\fP, если этот флаг указан. .RE .TP \fIss.ss_sp\fP Это поле задаёт начальный адрес стека. При вызове обработчика сигнала с альтернативным стеком ядро автоматически выравнивает адрес, указанный в \fIss.ss_sp\fP, по границе адреса, подходящей для используемой аппаратной платформы. .TP \fIss.ss_size\fP В этом поле задаётся размер стека. Для определения альтернативного стека сигналов достаточного размера можно использовать константу \fBSIGSTKSZ\fP, а для выделения стека минимального размера можно указать константу \fBMINSIGSTKSZ\fP. .PP Для отключения существующего стека, укажите в \fIss.ss_flags\fP значение \fBSS_DISABLE\fP. В этом случае ядро игнорирует все флаги в \fIss.ss_flags\fP и остальные поля в \fIss\fP. .PP Если \fIold_ss\fP не равно NULL, то в нём возвращается информация об альтернативном стеке сигналов, который использовался до этого вызова \fBsigaltstack\fP(). В полях \fIold_ss.ss_sp\fP и \fIold_ss.ss_size\fP возвращаются начальный адрес и размер стека. В \fIold_ss.ss_flags\fP может быть возвращено одно из следующих значений: .TP \fBSS_ONSTACK\fP The thread is currently executing on the alternate signal stack. (Note that it is not possible to change the alternate signal stack if the thread is currently executing on it.) .TP \fBSS_DISABLE\fP В данный момент альтернативный стек сигналов выключен. .IP .\" FIXME Was it intended that one can set up a different alternative .\" signal stack in this scenario? (In passing, if one does this, the .\" sigaltstack(NULL, &old_ss) now returns old_ss.ss_flags==SS_AUTODISARM .\" rather than old_ss.ss_flags==SS_DISABLE. The API design here seems .\" confusing... Alternatively, this value is returned if the thread is currently executing on an alternate signal stack that was established using the \fBSS_AUTODISARM\fP flag. In this case, it is safe to switch away from the signal handler with \fBswapcontext\fP(3). It is also possible to set up a different alternative signal stack using a further call to \fBsigaltstack\fP(). .TP \fBSS_AUTODISARM\fP Альтернативный стек сигналов был помечен к автоматической очистке (autodisarmed), как описывалось ранее. .PP Если присвоить \fIss\fP значение NULL,а \fIold_ss\fP — не NULL, то можно получить текущие настройки альтернативного стека сигналов без его изменения. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении \fBsigaltstack\fP() возвращается 0. В случае ошибки возвращается \-1, а \fIerrno\fP устанавливается в соответствующее значение. .SH ОШИБКИ .TP \fBEFAULT\fP Значение \fIss\fP или \fIold_ss\fP не равно NULL и указывает за пределы адресного пространства процесса. .TP \fBEINVAL\fP Значение \fIss\fP не равно NULL и в поле \fIss_flags\fP содержится некорректный флаг. .TP \fBENOMEM\fP Указанный размер нового альтернативного стека сигналов \fIss.ss_size\fP меньше \fBMINSIGSTKSZ\fP. .TP \fBEPERM\fP An attempt was made to change the alternate signal stack while it was active (i.e., the thread was already executing on the current alternate signal stack). .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBsigaltstack\fP() T} Безвредность в нитях MT\-Safe .TE .sp 1 .SH СТАНДАРТЫ POSIX.1\-2008. .PP \fBSS_AUTODISARM\fP is a Linux extension. .SH ИСТОРИЯ POSIX.1\-2001, SUSv2, SVr4. .SH ЗАМЕЧАНИЯ The most common usage of an alternate signal stack is to handle the \fBSIGSEGV\fP signal that is generated if the space available for the standard stack is exhausted: in this case, a signal handler for \fBSIGSEGV\fP cannot be invoked on the standard stack; if we wish to handle it, we must use an alternate signal stack. .PP Establishing an alternate signal stack is useful if a thread expects that it may exhaust its standard stack. This may occur, for example, because the stack grows so large that it encounters the upwardly growing heap, or it reaches a limit established by a call to \fB\%setrlimit(RLIMIT_STACK, &rlim)\fP. If the standard stack is exhausted, the kernel sends the thread a \fBSIGSEGV\fP signal. In these circumstances the only way to catch this signal is on an alternate signal stack. .PP На большинстве аппаратных архитектур, поддерживаемых Linux, стеки растут сверху вниз. Вызов \fBsigaltstack\fP() автоматически учтёт направление роста стека. .PP Functions called from a signal handler executing on an alternate signal stack will also use the alternate signal stack. (This also applies to any handlers invoked for other signals while the thread is executing on the alternate signal stack.) Unlike the standard stack, the system does not automatically extend the alternate signal stack. Exceeding the allocated size of the alternate signal stack will lead to unpredictable results. .PP A successful call to \fBexecve\fP(2) removes any existing alternate signal stack. A child process created via \fBfork\fP(2) inherits a copy of its parent's alternate signal stack settings. The same is also true for a child process created using \fBclone\fP(2), unless the clone flags include \fBCLONE_VM\fP and do not include \fBCLONE_VFORK\fP, in which case any alternate signal stack that was established in the parent is disabled in the child process. .PP Вызов \fBsigaltstack\fP() заменяет устаревший вызов \fBsigstack\fP(). Для обратной совместимости в glibc также есть функция \fBsigstack\fP(). Во всех новых приложениях нужно использовать \fBsigaltstack\fP(). .SS История Системный вызов \fBsigstack\fP() появился в 4.2BSD. В нём использовалась слегка другая структура, и его главным недостатком было то, что вызывающий должен был учитывать направления роста стека. .SH ДЕФЕКТЫ .\" Linux 2.3.40 .\" After quite a bit of web and mail archive searching, .\" I could not find the patch on any mailing list, and I .\" could find no place where the rationale for this change .\" explained -- mtk .\" See the source code of Illumos and FreeBSD, for example. В Linux 2.2 и старее в \fIss.sa_flags\fP можно указывать только флаг \fBSS_DISABLE\fP. В версиях до ядра Linux 2.4 разрешалось \fBsigaltstack\fP() допускать \fIss.ss_flags==SS_ONSTACK\fP с тем же смыслом как \fIss.ss_flags==0\fP (т. е., при включении \fBSS_ONSTACK\fP в \fIss.ss_flags\fP ни к чему не приводило). В других реализациях и согласно POSIX.1 флаг \fBSS_ONSTACK\fP появляется в \fIold_ss.ss_flags\fP только как флаг результата. В Linux его не нужно даже указывать в \fIss.ss_flags\fP, иначе это снизит переносимость, так как некоторые системы выдают ошибку, если в \fIss.ss_flags\fP указан \fBSS_ONSTACK\fP. .SH ПРИМЕРЫ В следующем сегменте кода показано использование \fBsigaltstack\fP() (и \fBsigaction\fP(2)) для установки альтернативного стека сигналов, который используется обработчиком для сигнала \fBSIGSEGV\fP: .PP .in +4n .EX stack_t ss; \& ss.ss_sp = malloc(SIGSTKSZ); if (ss.ss_sp == NULL) { perror("malloc"); exit(EXIT_FAILURE); } \& ss.ss_size = SIGSTKSZ; ss.ss_flags = 0; if (sigaltstack(&ss, NULL) == \-1) { perror("sigaltstack"); exit(EXIT_FAILURE); } \& sa.sa_flags = SA_ONSTACK; sa.sa_handler = handler(); /* Address of a signal handler */ sigemptyset(&sa.sa_mask); if (sigaction(SIGSEGV, &sa, NULL) == \-1) { perror("sigaction"); exit(EXIT_FAILURE); } .EE .in .SH "СМ. ТАКЖЕ" \fBexecve\fP(2), \fBsetrlimit\fP(2), \fBsigaction\fP(2), \fBsiglongjmp\fP(3), \fBsigsetjmp\fP(3), \fBsignal\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 .