Пространства имён
Варианты
Действия

std::signal

Материал из cppreference.com
< cpp‎ | utility‎ | program
 
 
 
Коммунальные услуги Программа поддержки
Программа прекращения
Оригинал:
Program termination
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
abort
exit
quick_exit(C++11)
_Exit(C++11)
Взаимодействие с окружающей средой
Оригинал:
Communicating with the environment
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Сигналы
Оригинал:
Signals
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Сигнал типа
Оригинал:
Signal types
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
SIGABRT
SIGFPE
SIGILL
SIGINT
SIGSEGV
SIGTERM
Нелокальные переходы
Оригинал:
Non-local jumps
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
setjmp
longjmp
Типы
Оригинал:
Types
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
jmp_buf
 
Определено в заголовочном файле <csignal>
void (*signal( int sig, void (*handler) (int))) (int);

Устанавливает обработчик, который вызывается при возникновении сигнала sig. Обработчик сигнала может установлен так, чтобы выполнился обработчик по умолчанию, сигнал был проигнорирован или была вызвана пользовательская функция.

Когда обработчик сигнала установлен на функцию и произошёл сигнал, то в зависимости от реализации std::signal(sig, SIG_DFL) немедленно будет выполнен ещё до старта обработчика сигнала. Также реализация может предотвратить возникновение некоторых видов сигналов, когда работает обработчик сигнала.

Для некоторых сигналов при старте программы реализация может вызвать std::signal(sig, SIG_IGN). Для остальных сигналов реализация должна вызвать std::signal(sig, SIG_DFL).

Содержание

[править] Параметры

sig - Сигнал, который будет обрабатывать обработчик сигнала. Это может быть как определённые реализацией значения, так и значение из следующего списка:
Определяет типы сигналов
(константа-макрос) [править]


handler - Обработчик сигнала. Он должен быть следующим:
  • Макрос SIG_DFL. Обработчик сигнала по умолчанию.
  • Макрос SIG_IGN. Сигнал игнорируется.
  • Указатель на функцию. При этом сигнатура функции должна быть следующей:
void fun(int sig);

[править] Возвращаемое значение

Возвращается предыдущий обработчик сигнала или SIG_ERR в случае ошибки (установка обработчиков сигналов может быть отключена на некоторых реализациях)

[править] Обработчик сигнала

Следующие ограничения накладываются на пользовательскую функцию, которая установлена в качестве обработчика сигнала:

Если пользовательская функция выполнила возврат, когда случился сигнал SIGFPE, SIGILL, SIGSEGV или любой другой определённый реализацией сигнал, определяющий ошибку вычисления, то поведение будет не определено.

Если обработчик сигнала вызван в результате вызова std::abort или std::raise, то поведение будет не определено, если обработчик сигнала вызовет std::raise.

Если обработчик сигнала вызван не в результате вызова std::abort или std::raise, то поведение будет не определено, в том случае если:

  • Обработчик сигнала вызывает любую функцию из стандартной библиотеки, кроме std::abort, std::_Exit, std::quick_exit или std::signal, чей первый аргумент не является номером текущего обрабатываемого сигнала.
  • Обработчик сигнала обращается к любому объекту со статическим или потоковым(начиная с C++11) временем хранения, которые не являются std::atomic(начиная с C++11) или volatile std::sig_atomic_t.

При входе в обработчик сигнала, состояние окружения для чисел с плавающей запятой и все значение любый объектов не определено, кроме

После возвращения из обработчика сигнала, значение любых объектов, которые были изменены с помощью обработчика сигналов, кроме volatile std::sig_atomic_t или std::atomic, не определено.

Поведение не определено, если std::signal используется в многопотоковых приложениях. Не требуется, чтобы эта функция была потокобезопасна. .

[править] Примечание

POSIX требует, чтобы signal был потокобезопасным, и определяется список потокобезопасных асинхронных библиотечных функций, которые могут быть вызваны из любого обработчика сигнала.

Обработчики сигнала должны иметь Си-линковку, и вообще говоря использовать только функции, которые одинаковы как для Си, так и для C++. Поддержка функций с линковкой C++ в качестве обработчиков сигналов зависит от реализации

[править] Пример

#include <csignal>
#include <iostream>
 
namespace
{
  volatile std::sig_atomic_t gSignalStatus;
}
 
void signal_handler(int signal)
{
  gSignalStatus = signal;
}
 
int main()
{
  // Установка обработчика сигнала
  std::signal(SIGINT, signal_handler);
 
  std::cout << "Значение сигнала: " << gSignalStatus << '\n';
  std::cout << "Передаём сигнал " << SIGINT << '\n';
  std::raise(SIGINT);
  std::cout << "Значение сигнала: " << gSignalStatus << '\n';
}

Возможный вывод:

Значение сигнала: 0
Передаём сигнал 2
Значение сигнала: 2

[править] См. также

Вызывает для конкретного сигнала его обработчик
(функция) [править]
C documentation for signal
защитное ограждение между потоком и обработчиком сигнала выполняющимся в том же потоке
Оригинал:
fence between a thread and a signal handler executed in the same thread
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(функция) [править]