Введение

В вычислительной технике sigaction — это функция API, определённая стандартом POSIX, предоставляющая программисту возможность управлять поведением программы при получении конкретных сигналов операционной системы.

Общий

В операционных системах, подобных Unix, одним из способов межпроцессного взаимодействия является использование сигналов. Когда выполняемый блок (процесс или поток) получает сигнал от ОС, он должен каким-либо образом отреагировать, в соответствии с технической документацией и общепринятым значением этого сигнала (например, сбросить данные, остановить выполнение, выполнить синхронизацию). Системный вызов `sigaction` используется для определения поведения программы при получении конкретного сигнала, не зарезервированного системой. Это достигается путем передачи вместе с системным вызовом структуры, содержащей, в частности, указатель на функцию, обрабатывающую сигнал. Некоторые предопределенные сигналы (например, SIGKILL) имеют фиксированное поведение, которое обрабатывается системой и не может быть изменено с помощью таких системных вызовов.

Замена сигнала

Функция `sigaction` предоставляет интерфейс для надежных сигналов, заменяющий ненадежную функцию `signal`. Обработчики сигналов, установленные через интерфейс `signal`, удаляются непосредственно перед выполнением обработчика. Поэтому постоянные обработчики необходимо повторно устанавливать вызовом `signal` во время выполнения обработчика, что приводит к ненадежности в случае получения сигнала того же типа во время выполнения обработчика, но до его повторной установки. Обработчики, установленные через интерфейс `sigaction`, могут быть установлены постоянно, и во время выполнения обработчика можно заблокировать пользовательский набор сигналов. Эти сигналы будут разблокированы сразу после нормального завершения обработчика (но не в случае аномального завершения, например, при выбросе исключения C++).

Использование в C++

В C++ структура программирования `try {/* */}` `catch {/* */}` может быть (в зависимости от хост-платформы) реализована на основе сигналов. Для перехвата сигналов, преобразованных в исключения C++, на некоторых платформах, таких как GCC и Intel C Compiler, могут потребоваться специальные флаги компилятора, например, `fnon-call-exceptions`.