signal
|
Определено в заголовке
<signal.h>
|
||
|
void
(
*
signal
(
int
sig,
void
(
*
handler
)
(
int
)
)
)
(
int
)
;
|
||
Устанавливает обработчик ошибок для сигнала
sig
. Обработчик сигнала может быть установлен таким образом, что будет происходить обработка по умолчанию, сигнал будет игнорироваться или будет вызываться пользовательская функция.
Когда обработчик сигнала установлен на функцию и возникает сигнал, определяется реализацией, будет ли signal ( sig, SIG_DFL ) выполнен непосредственно перед запуском обработчика сигнала. Кроме того, реализация может предотвращать возникновение некоторого определённого реализацией набора сигналов во время выполнения обработчика сигнала.
Содержание |
Параметры
| sig | - |
сигнал, для которого устанавливается обработчик. Может быть реализационно-определенным значением или одним из следующих значений:
|
||||||
| handler | - |
обработчик сигнала. Должен быть одним из следующих:
|
Возвращаемое значение
Предыдущий обработчик сигнала при успехе или SIG_ERR при неудаче (установка обработчика сигнала может быть отключена в некоторых реализациях).
Обработчик сигналов
На пользовательскую функцию, устанавливаемую в качестве обработчика сигнала, накладываются следующие ограничения.
Если пользовательская функция возвращает управление при обработке SIGFPE , SIGILL или SIGSEGV , поведение не определено.
Если обработчик сигнала вызывается в результате abort или raise , поведение не определено, если обработчик сигнала вызывает raise .
Если обработчик сигнала вызывается НЕ в результате abort или raise (другими словами, обработчик сигнала является асинхронным ), поведение не определено, если
- обработчик сигнала вызывает любую функцию из стандартной библиотеки, кроме
-
- abort
- _Exit
- quick_exit
-
signalс первым аргументом, являющимся номером обрабатываемого в данный момент сигнала (асинхронный обработчик может перерегистрировать себя, но не другие сигналы). -
атомарные функции из
<stdatomic.h>если атомарные аргументы являются lock-free - atomic_is_lock_free (с любыми типами атомарных аргументов)
- обработчик сигнала ссылается на любой объект со статической или поточно-локальной (since C11) длительностью хранения , который не является безблокировочным атомарным (since C11) , кроме как через присваивание статической переменной volatile sig_atomic_t .
При входе в обработчик сигнала состояние окружения с плавающей запятой и значения всех объектов не определены, за исключением
- объекты типа volatile sig_atomic_t
- объекты типов lock-free atomic (since C11)
- побочные эффекты, становящиеся видимыми через atomic_signal_fence (since C11)
При возврате из обработчика сигнала значение любого объекта, изменённого обработчиком сигнала, который не является volatile sig_atomic_t или lock-free atomic (since C11) , является неопределённым.
Поведение не определено, если signal используется в многопоточном приложении. Не требуется, чтобы он был потокобезопасным.
Примечания
POSIX требует, чтобы
signal
был потокобезопасным, и
определяет список асинхронно-безопасных библиотечных функций
, которые могут вызываться из любого обработчика сигналов.
Помимо
abort
и
raise
, POSIX определяет, что
kill
,
pthread_kill
и
sigqueue
генерируют синхронные сигналы.
POSIX рекомендует использовать
sigaction
вместо
signal
из-за недостаточно специфицированного поведения и значительных вариаций в реализациях, касающихся доставки сигналов во время выполнения обработчика сигнала.
Пример
#include <signal.h> #include <stdio.h> volatile sig_atomic_t gSignalStatus; void signal_handler(int signal) { gSignalStatus = signal; } int main(void) { signal(SIGINT, signal_handler); printf("SignalValue: %d\n", gSignalStatus); printf("Sending signal: %d\n", SIGINT); raise(SIGINT); printf("SignalValue: %d\n", gSignalStatus); }
Вывод:
SignalValue: 0 Sending signal: 2 SignalValue: 2
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.14.1.1 Функция signal (стр. 193-194)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.14.1.1 Функция signal (стр. 266-267)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.14.1.1 Функция signal (стр. 247-248)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 4.7.1.1 Функция signal
Смотрите также
|
запускает обработчик сигнала для конкретного сигнала
(функция) |
|
|
C++ documentation
для
signal
|
|