Операционная система UNIX - страница 76
>
> 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
определена в файле
>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 | Устройство отключено |
Уже отмечалось, что при получении сигнала от пользовательского процесса структура >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
>int sigprocmask(int how, sigset_t *set, sigset_t *oset);
Маска сигналов изменяется в соответствии с аргументом