Читаем без скачивания Операционная система UNIX - Андрей Робачевский
Шрифт:
Интервал:
Закладка:
В поле 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 Устройство отключеноУже отмечалось, что при получении сигнала от пользовательского процесса структура siginfo_t содержит дополнительные поля (табл. 2.20).
Таблица 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):
#include <signal.h>
int sigprocmask(int how, sigset_t *set, sigset_t *oset);
Маска сигналов изменяется в соответствии с аргументом how, который может принимать следующие значения:
SIG_BLOCK Результирующая маска получится путем объединения текущей маски и набора set SIG_UNBLOCK Сигналы набора set будут удалены из текущей маски SIG_SETMASK Текущая маска будет заменена на набор setЕсли указатель set равен NULL, то аргумент how игнорируется. Если аргумент oset не равен NULL, то в набор, адресованный этим аргументом, помещается текущая маска сигналов.
Функция sigpending(2) используется для получения набора заблокированных сигналов, ожидающих доставки:
#include <signal.h>
int sigpending(int how, sigset_t *set, sigset_t *oset);
Список сигналов, ожидающих доставки, возвращается в наборе, адресованном аргументом set.
Системный вызов sigsuspend(2) замещает текущую маску набором, адресованным аргументом set, и приостанавливает выполнение процесса до получения сигналов, диспозиция которых установлена либо на завершение выполнения процесса, либо на вызов функции-обработчика сигнала.
#include <signal.h>
int sigsuspend(const sigset_t *set);
При получении сигнала, завершающего выполнение процесса, возврата из функции sigsuspend(2) не происходит. Если же диспозиция полученного сигнала установлена на вызов функции-обработчика, возврат из sisuspend(2) происходит сразу после завершения обработки сигнала. При этом восстанавливается маска, существовавшая до вызова sigsuspend(2).