• si_errno — если значение этого поля не равно 0, значит, оно содержит номер ошибки (как errno), идентифицирующий причину отправки сигнала. Как правило, это поле в Linux не задействуется.
• si_addr — устанавливается только для аппаратно генерируемых сигналов SIGBUS, SIGSEGV, SIGILL и SIGFPE. Для сигналов SIGBUS и SIGSEGV оно содержит адрес, вызвавший возникновение ошибки неверной ссылки на участок памяти. Для сигналов SIGILL и SIGFPE это поле содержит адрес программной инструкции, вызвавшей подачу сигнала.
Следующие поля, не являющиеся стандартными расширениями Linux, устанавливаются только по получении сигнала, генерируемого по истечении времени таймера POSIX (см. раздел 23.6).
• si_timerid — содержит идентификатор, используемый внутри ядра для обозначения таймера.
• si_overrun — устанавливается равным счетчику переполнения таймера.
Следующие поля устанавливаются лишь по получении сигнала SIGIO (см. раздел 59.3).
• si_band — содержит значение «связывающего события», ассоциированного с событием ввода-вывода. (В версиях glibc вплоть до 2.3.2 поле si_band имело тип int.)
• si_fd — хранит номер файлового дескриптора, ассоциированного с событием ввода-вывода. Это поле не указано в стандарте SUSv3, но есть во многих реализациях.
Следующие поля устанавливаются только по получении сигнала SIGCHLD (см. раздел 26.3).
• si_status — может содержать либо код завершения дочернего процесса (если значение поля si_code установлено как CLD_EXITED), либо номер сигнала, отправленного в дочерний процесс (иными словами, номер сигнала, завершившего или остановившего дочерний процесс, как описано в подразделе 26.1.3).
• si_utime — содержит пользовательское время ЦП, затраченное дочерним процессом. В версиях ядра 2.6 старше 2.6.27 это время измеряется тактами системных часов (деление на sysconf(_SC_CLK_TCK)). В версиях ядра 2.6 младше 2.6.27 из-за допущенной ошибки это поле отражало время, измеряемое в тактах, частота которых могла быть изменена пользователем (см. раздел 10.6). Это поле не установлено стандартом SUSv3, однако присутствует во многих реализациях.
• si_stime — хранит системное время ЦП, затраченное дочерним процессом. См. описание поля si_utime. Не установлено стандартом SUSv3, однако присутствует во многих реализациях.
Поле si_code предоставляет дополнительную информацию об источнике сигнала с помощью значений, приведенных в табл. 21.2. Не все значения, зависящие от конкретного сигнала и приведенные в таблице, свойственны для всех реализаций UNIX и аппаратных архитектур (особенно если речь идет об аппаратно генерируемых сигналах: SIGBUS, SIGSEGV, SIGILL и SIGFPE). Однако все эти константы определены в Linux, и большинство из них установлено стандартом SUSv3.
Обратите внимание на следующие аспекты значений, приведенных в табл. 21.2.
• Значения SI_KERNEL и SI_SIGIO зависят от версии Linux. Они не установлены стандартом SUSv3 и не свойственны абсолютно всем реализациям UNIX.
• Константа SI_SIGIO используется только в Linux версии 2.2. Начиная с версии ядра 2.4, эта константа в Linux была заменена на POLL_*, также приведенные в таблице.
Таблица 21.2. Значения, возвращаемые полем si_code структуры siginfo_t
Сигнал — Значение поля si_code — Источник сигнала
Любой
SI_ASYNCIO — Завершение асинхронной операции ввода-вывода (AIO)
SI_KERNEL — Отправлен ядром (например, сигнал драйвера терминала)
SI_MESGQ — Прибытие сообщения в очередь сообщений POSIX (начиная с Linux 2.6)
SI_QUEUE — Сигнал реального времени от пользовательского процесса через sigqueue()
SI_SIGIO — Сигнал SIGIO (Только Linux 2.2)
SI_TIMER — Истечение времени таймера POSIX (реальное время)
SI_TKILL — Пользовательский процесс через tkill() или tgkill() (начиная с Linux 2.4.19)
SI_USER — Пользовательский процесс через kill()
SIGBUS
BUS_ADRALN — Неверное выравнивание адреса
BUS_ADREER — Несуществующий физический адрес
BUS_MCEERR_AO — Аппаратная ошибка памяти, возможно действие (начиная с Linux 2.6.32)
BUS_MCEERR_AR — Аппаратная ошибка памяти, требуется действие (начиная с Linux 2.6.32)
BUS_OBJERR — Объектная аппаратная ошибка (зависит от объекта)
SIGCHLD
CLD_CONTINUED — Дочерний процесс продолжен по сигналу SIGCONT (начиная с Linux 2.6.9)
CLD_DUMPED — Дочерний процесс завершен аварийно с дампом ядра
CLD_EXITED — Из дочернего процесса осуществлен выход
CLD_KILLED — Дочерний процесс завершен аварийно без дампа ядра
CLD_STOPPED — Дочерний процесс остановлен
CLD_TRAPPED — Отслеживаемый дочерний процесс остановлен
SIGFPE
FPE_FLTDIV — Деление на ноль числа с плавающей точкой
FPE_FLTINV — Неверная операция с числом с плавающей точкой
FPE_FLTOVF — Переполнение числа с плавающей точкой
FPE_FLTRES — Неточный результат операции с числом с плавающей точкой
FPE_FLTUND — Исчезновение значащих разрядов числа с плавающей точкой
FPE_INTDIV — Целочисленное деление на ноль
FPE_INTOVF — Переполнение целого числа
FPE_SUB — Основание числа вне допустимого диапазона
SIGILL
ILL_BADSTK — Внутренняя ошибка стека
ILL_COPROC — Ошибка сопроцессора