std::signal
Определено в заголовке <csignal> | ||
|---|---|---|
/*signal-handler*/* signal( int sig, /*signal-handler*/* handler ); | (1) | |
extern "C" using /*signal-handler*/ = void(int); | (2) | (только для примера*) |
Изменяет обработку сигнала sig. В зависимости от handler, сигнал может быть проигнорирован, установлен по умолчанию или обработан пользовательской функцией.
Когда обработчик сигнала задан в виде функции и происходит сигнал, поведение, когда std::signal(sig, SIG_DFL) будет выполнено непосредственно перед началом обработки сигнала, определено реализацией. Также реализация может предотвратить возникновение некоторых определенных реализацией сигналов во время выполнения обработчика сигнала.
Для некоторых сигналов реализация может вызывать std::signal(sig, SIG_IGN) при запуске программы. Для остальных реализация должна вызывать std::signal(sig, SIG_DFL).
(Примечание: POSIX ввел sigaction, чтобы стандартизировать эти определенные реализацией поведения)
Параметры
| sig | - | сигнал, для которого нужно задать обработчик. Может быть определенным реализацией значением или одним из следующих значений:
|
|||
| handler | - | обработчик сигнала. Должен быть одним из следующих:
|
Возвращаемое значение
Предыдущий обработчик сигнала при успехе или SIG_ERR при ошибке (установка обработчика сигнала может быть отключена в некоторых реализациях).
Обработчик сигнала
На пользовательскую функцию, установленную в качестве обработчика сигнала, накладываются следующие ограничения.
| Если обработчик сигнала вызывается НЕ в результате
| (до C++17) |
| Простая атомарная операция без блокировок — вызов функции
Поведение не определено, если любой обработчик сигнала выполняет одно из следующих действий:
| (с C++17) |
Если пользовательская функция возвращает значение при обработке SIGFPE, SIGILL, SIGSEGV или любого другого определенного реализацией сигнала, указывающего на вычислительную исключительную ситуацию, поведение не определено.
Если обработчик сигнала вызывается в результате std::abort или std::raise (синхронный сигнал), поведение не определено, если обработчик сигнала вызывает std::raise.
| При входе в обработчик сигнала состояние среды с плавающей запятой и значения всех объектов не определены, за исключением
При выходе из обработчика сигнала значение любого объекта, изменённого обработчиком сигнала, который не является volatile std::sig_atomic_t или не требующим блокировок | (до C++14) | ||
| Вызов функции Если обработчик сигнала выполняется в результате вызова Два доступа к одному объекту типа volatile std::sig_atomic_t не приводят к гонке данных, если оба происходят в одном потоке, даже если один или несколько происходят в обработчике сигнала. Для каждого вызова обработчика сигнала вычисления, выполняемые потоком, вызывающим обработчик сигнала, можно разделить на две группы A и B таким образом, что никакие вычисления в B не происходят раньше вычислений в A, а значения таких объектов volatile std::sig_atomic_t принимают значения так, как будто все вычисления в A произошли раньше выполнения обработчика сигнала, а выполнение обработчика сигнала произошло раньше всех вычислений в B. | (с C++14) |
Примечания
POSIX требует, чтобы signal был потокобезопасным, и указывается список функций библиотеки, безопасных для асинхронных сигналов, которые могут вызываться из любого обработчика сигнала.
Обработчики сигналов должны иметь C-связь и, как правило, использовать только функции из общего подмножества C и C++. Однако в общих реализациях допускается использование функции с C++-связью в качестве обработчика сигналов.
Пример
#include <csignal>
#include <iostream>
namespace
{
volatile std::sig_atomic_t gSignalStatus;
}
void signal_handler(int signal)
{
gSignalStatus = signal;
}
int main()
{
// Install a signal handler
std::signal(SIGINT, signal_handler);
std::cout << "SignalValue: " << gSignalStatus << '\n';
std::cout << "Sending signal: " << SIGINT << '\n';
std::raise(SIGINT);
std::cout << "SignalValue: " << gSignalStatus << '\n';
}Возможный вывод:
SignalValue: 0 Sending signal: 2 SignalValue: 2
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2023):
- 17.13.5 Обработчики сигналов [support.signal]
- Стандарт C++20 (ISO/IEC 14882:2020):
- 17.13.5 Обработчики сигналов [support.signal]
- Стандарт C++17 (ISO/IEC 14882:2017):
- 21.10.4 Обработчики сигналов [support.signal]
Отчёты о дефектах
Следующие отчёты о дефектах, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 3756 | C++17 | неясно, является ли std::atomic_flag безопасным для обработки сигналов | является |
См. также
| выполняет обработчик сигнала для определённого сигнала (функция) |
|
|
(C++11) | барьер между потоком и обработчиком сигнала, выполняемым в том же потоке (функция) |
Документация C для signal |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/program/signal