Функция sigaction в POSIX: надежная обработка сигналов.
Sigaction
Системный вызов sigaction в POSIX: обработка сигналов ОС в Unix-подобных системах. Настройка поведения программы при получении сигналов через указатель функции.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
В вычислительной технике sigaction — это функция API, определённая стандартом POSIX, предоставляющая программисту возможность управлять поведением программы при получении конкретных сигналов операционной системы.
In computing, sigaction is a function API defined by POSIX to give the programmer access to what should be a program's behavior when receiving specific OS signals.
Общий
В операционных системах, подобных Unix, одним из способов межпроцессного взаимодействия является использование сигналов. Когда выполняемый блок (процесс или поток) получает сигнал от ОС, он должен каким-либо образом отреагировать, в соответствии с технической документацией и общепринятым значением этого сигнала (например, сбросить данные, остановить выполнение, выполнить синхронизацию). Системный вызов `sigaction` используется для определения поведения программы при получении конкретного сигнала, не зарезервированного системой. Это достигается путем передачи вместе с системным вызовом структуры, содержащей, в частности, указатель на функцию, обрабатывающую сигнал. Некоторые предопределенные сигналы (например, SIGKILL) имеют фиксированное поведение, которое обрабатывается системой и не может быть изменено с помощью таких системных вызовов.
In Unix like operating systems, one means of inter process communication is through signals. When an executing unit (process or thread) receives a signal from the OS, it should react in some way defined by the datasheet and the conventional meaning of this signal (i. e. by dumping its data, stopping execution, synchronizing something ). The sigaction system call is used to declare the behavior of the program should it receive one particular non system reserved signal. This is done by giving along with the system call a structure containing, among others, a function pointer to the signal handling routine. Some predefined signals (such as SIGKILL) have locked behavior that is handled by the system and cannot be overridden by such system calls.
Замена сигнала
Функция `sigaction` предоставляет интерфейс для надежных сигналов, заменяющий ненадежную функцию `signal`. Обработчики сигналов, установленные через интерфейс `signal`, удаляются непосредственно перед выполнением обработчика. Поэтому постоянные обработчики необходимо повторно устанавливать вызовом `signal` во время выполнения обработчика, что приводит к ненадежности в случае получения сигнала того же типа во время выполнения обработчика, но до его повторной установки. Обработчики, установленные через интерфейс `sigaction`, могут быть установлены постоянно, и во время выполнения обработчика можно заблокировать пользовательский набор сигналов. Эти сигналы будут разблокированы сразу после нормального завершения обработчика (но не в случае аномального завершения, например, при выбросе исключения C++).
The sigaction function provides an interface for reliable signals in replacement of the unreliable signal function. Signal handlers installed by the signal interface will be uninstalled immediately prior to execution of the handler. Permanent handlers must therefore be reinstalled by a call to signal during the handler's execution, causing unreliability in the event a signal of the same type is received during the handler's execution but before the reinstall. Handlers installed by the sigaction interface can be installed permanently and a custom set of signals can be blocked during the execution of the handler. These signals will be unblocked immediately following the normal termination of the handler (but not in the event of an abnormal termination such as a C++ exception throw.)
Использование в C++
В C++ структура программирования `try {/* */}` `catch {/* */}` может быть (в зависимости от хост-платформы) реализована на основе сигналов. Для перехвата сигналов, преобразованных в исключения C++, на некоторых платформах, таких как GCC и Intel C Compiler, могут потребоваться специальные флаги компилятора, например, `fnon-call-exceptions`.
In C++, the try {/* */} catch {/* */} programming structure may be (depending on host platforms) based on signalling. To catch signals translated into C++ exceptions, special compiler switches may be necessary on some platforms such as fnon call exceptions for GCC and the Intel C Compiler.