Операционная система UNIX
Шрифт:
Вся необходимая для управлением сигналами информация передается через указатель на структуру
void (*sa_handler) | Обработчик сигнала sig |
void (*sa_sigaction)(int, siginfo_t*, void*) | Обработчик сигнала sig при установленном флаге SA_SIGINFO |
sigset_t sa_mask | Маска сигналов |
int sa_flags | Флаги |
Поле
Поле
SA_ONSTACK | Если определена функция-обработчик сигнала, и с помощью функции sigaltstack(2) задан альтернативный стек для функции-обработчика, то при обработке сигнала будет использоваться этот стек. Если флаг не установлен, будет использоваться обычный стек процесса. |
SA_RESETHAND * | Если определена функция-обработчик, то диспозиция сигнала будет изменена на SIG_DFL , и сигнал не будет блокироваться при запуске обработчика. Если флаг не установлен, диспозиция сигнала остается неизменной. |
SA_NODEFER * | Если определена функция-обработчик, то сигнал блокируется на время обработки только в том случае, если он явно указан в поле sa_mask . Если флаг не установлен, в процессе обработки данный сигнал автоматически блокируется. |
SA_RESTART | Если определена функция-обработчик, ряд системных вызовов, выполнение которых было прервано полученным сигналом, будут автоматически перезапущены после обработки сигнала. [25] Если флаг не установлен, системный вызов возвратит ошибку EINTR . |
SA_SIGINFO * | Если диспозиция указывает на перехват сигнала, вызывается функция, адресованная полем sa_sigaction . Если флаг не установлен, вызывается обработчик sa_handler . |
SA_NOCLDWAIT * | Если указанный аргументом sig сигнал равен SIGCHLD , при завершении потомки не будут переходить в состояние зомби. Если процесс в дальнейшем вызовет функции wait(2), wait3(2), waitid(2) или waitpid(2), их выполнение будет блокировано до завершения работы всех потомков данного процесса. |
SA_NOCLDSTOP * | Если указанный аргументом sig сигнал равен SIGCHLD , указанный сигнал не будет отправляться процессу при завершении или останове любого из его потомков. |
25
К таким системным вызовам, в частности, относятся read(2) и write(2) для медленных устройств, таких как терминалы, а также ioctl(2), fcntl(2), wait(2) и waitpid(2).
*Данные флаги не определены для UNIX BSD.
В системах UNIX BSD 4.x структура
где функция-обработчик определена следующим образом:
В первом аргументе
Для UNIX System V реализована следующая возможность получения более полной информации о сигнале. Если установлен флаг
Структура
int si_signo | Номер сигнала |
int si_errno | Номер ошибки |
int si_code | Причина отправления сигнала |
В поле
pid_t si_pid | Идентификатор процесса PID |
uid_t si_uid | Идентификатор пользователя UID |
которые адресуют процесс, пославший сигнал; если значение
Таблица 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 | Устройство отключено |
Уже отмечалось, что при получении сигнала от пользовательского процесса структура
Таблица 2.20. Дополнительные поля структуры siginfo_t
Значение поля si_signo | Дополнительные поля | Значение |
---|---|---|
SIGILL SIGFPE | caddr_t si_addr | Адрес недопустимой инструкции |
SIGSEGV SIGBUS | caddr_t si_addr | Адрес недопустимой области памяти |
SIGCHLD | pid_t si_pid | Идентификатор дочернего процесса |
int si_status | Код возврата сигнала | |
SIGPOLL | long si_band | Ошибка канала (для модулей STREAMS) |
Установить маску сигналов или получить текущую маску можно с помощью функции sigprocmask(2):
Маска сигналов изменяется в соответствии с аргументом
SIG_BLOCK | Результирующая маска получится путем объединения текущей маски и набора set |
SIG_UNBLOCK | Сигналы набора set будут удалены из текущей маски |
SIG_SETMASK | Текущая маска будет заменена на набор set |