Операционная система 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);

Маска сигналов изменяется в соответствии с аргументом