*Данные флаги не определены для UNIX BSD.
В системах UNIX BSD 4.x структура sigaction имеет следующий вид:
struct sigaction {
void (*sa_handler)();
sigset_t sa_mask;
int sa_flags;
};
где функция-обработчик определена следующим образом:
void handler(int signo, int code, struct sigcontext *scp);
В первом аргументе signo содержится номер сигнала, code определяет дополнительную информацию о причине поступления сигнала, a scp указывает на контекст процесса.
Для UNIX System V реализована следующая возможность получения более полной информации о сигнале. Если установлен флаг SA_SIGINFO, то при получении сигнала sig будет вызван обработчик, адресованный полем sa_sigaction. Помимо номера сигнала, обычно передаваемого обработчику сигнала, ему будет переданы указатель на структуру siginfo_t, содержащую информацию о причинах получения сигнала, а также указатель на структуру ucontext_t, содержащую контекст процесса.
Структура siginfo_t определена в файле <siginfo.h> и включает следующие поля:
int si_signo |
Номер сигнала |
int si_errno |
Номер ошибки |
int si_code |
Причина отправления сигнала |
В поле si_signo хранится номер сигнала. Поле si_code имеет следующий смысл: если его значение меньше или равно нулю, значит сигнал был отправлен прикладным процессом, в этом случае структура siginfo_t содержит также следующие поля:
pid_t si_pid |
Идентификатор процесса PID |
uid_t si_uid |
Идентификатор пользователя UID |
которые адресуют процесс, пославший сигнал; если значение si_code больше нуля, то оно указывает на причину отправления сигнала. Список возможных значений si_code для некоторых сигналов, соответствующих полю si_signo, приведен в табл. 2.19
Таблица 2.19. Значения поля si_code структуры siginfo_t для некоторых сигналов
Значение поля si_signo |
Значение поля si_code |
Описание |
|---|---|---|
SIGILL |
Попытка выполнения недопустимой инструкции | |
ILL_ILLOPC |
Недопустимый код операции (opcode) | |
ILL_ILLOPN |
Недопустимый операнд | |
ILL_ADR |
Недопустимый режим адресации | |
ILL_ILLTRP |
Недопустимая ловушка (trap) | |
ILL_PRVOPC |
Привилегированный код операции | |
ILL_PRVREG |
Привилегированный регистр | |
ILL_COPROC |
Ошибка сопроцессора | |
ILL_BADSTK |
Ошибка внутреннего стека | |
SIGFPE |
Особая ситуация операции с плавающей точкой | |
FPE_INTDIV |
Целочисленное деление на ноль | |
FPE_INTOVF |
Целочисленное переполнение | |
FPE_FLTDIV |
Деление на ноль с плавающей точкой | |
FPE_FLTOVF |
Переполнение с плавающей точкой | |
FPE_FLTUND |
Потеря точности с плавающей точкой (underflow) | |
FPE_FLTRES |
Неоднозначный результат операции с плавающей точкой | |
FPE_FLTINV |
Недопустимая операция с плавающей точкой | |
FPE_FLTSUB |
Индекс вне диапазона | |
SIGSEGV |
Нарушение сегментации | |
SEGV_MAPPER |
Адрес не отображается на объект | |
SEGV_ACCERR |
Недостаточно прав на отображаемый объект | |
SIGBUS |
Ошибка адресации | |
BUS_ADRALN |
Недопустимое выравнивание адреса | |
BUS_ADRERR |
Несуществующий физический адрес | |
BUS_OBJERR |
Аппаратная ошибка, связанная с объектом | |
SIGTRAP |
Ловушка | |
TRAP_BRKPT |
Процессом достигнута точка останова | |
TRAP_TRACE |
Ловушка трассирования процесса | |
SIGCHLD |
Завершение выполнения дочернего процесса | |
CLD_EXITED |
Дочерний процесс завершил выполнение | |
CLD_KILLED |
Дочерний процесс был "убит" | |
CLD_DUMPED |
Ненормальное завершение дочернего процесса | |
CLD_TRAPPED |
Трассируемый дочерний процесс находится в ловушке | |
CLD_STOPPED |
Выполнение дочернего процесса было остановлено | |
CLD_CONTINUED |
Выполнение остановленного дочернего процесса было продолжено | |
SIGPOLL |
Событие на опрашиваемом устройстве | |
POLL_IN |
Поступили данные для ввода | |
POLL_OUT |
Свободны буферы данных | |
POLL_MSG |
Сообщение ожидает ввода | |
POLL_ERR |
Ошибка ввода/вывода | |
POLL_PRI |
Высокоприоритетные данные ожидают ввода | |
POLL_HUP |
Устройство отключено | |