Разработка приложений в среде Linux. Второе издание
Шрифт:
#include <signal.h>
struct sigaction {
union {
__sighandler_t sa_handler;
__sigaction_t sa_sigaction;
} __sigaction_handler;
sigset_t sa_mask;
unsigned long sa_flags;
};
#define sa_handler __sigaction_handler.sa_handler
#define sa_sigaction __sigaction_handler.sa_sigaction
Использование представленной комбинации объединений и макросов позволяет этим двум членам разделять одну и ту же память без необходимости усложнения с точки зрения приложений.
Структура
siginfo_t
sa_signo
и si_code
. Какие другие члены доступны — зависит от конкретного сигнала, и эти члены разделяют память подобно тому, как это делают члены sa_handler
и sa_sigaction
структуры struct sigaction
. Член sa_signo
содержит номер доставленного сигнала и всегда равен значению первого параметра, переданного обработчику сигнала, в то время как si_code
указывает, почему сигнал был сгенерирован, и изменяется в зависимости от номера сигнала. Для большинства сигналов он может принимать перечисленные ниже значения. [70] 70
Существует гораздо больше значений
si_code
, нежели мы обсуждаем здесь, и эти значения имеют отношение к асинхронному вводу-выводу, очередям сообщений и таймерам реального времени, что выходит за границы тем, обсуждаемых в книге. SI_USER
Приложение пространства пользователя вызвало
kill
для отправки сигнала. Примечание. Функция sigsend
, включенная в Linux для совместимости с некоторыми системами Unix, также выдает SI_USER
. SI_QUEUE
Приложение пространства пользователя вызвало
sigqueue
для от правки сигнала, что обсуждается в самом конце этой главы. SI_TKILL
Приложение пространства пользователя вызвало
tkill
. В то время как ядро Linux использует SI_TKILL
, его значение не специфицировано в текущей версии библиотеки С. Если вам нужно проверить
SI_TKILL
, используйте следующий сегмент кода для определения этого значения: #ifndef SI_TKILL
#define SI_TKILL -6
#endif
SI_TKILL
не специфицирован ни в каком стандарте (хотя допускается ими), поэтому его следует применять осторожно в переносимых программах. SI_KERNEL
Сигнал сгенерирован ядром.
Когда
SIGILL
, SIGFPE
, SIGSEGV
, SIGBUS
и SIGCHLD
посылаются ядром, то si_code
вместо si_kernel
принимает значения, перечисленные в табл. 12.3 [71] .71
Он также принимает специальное значение
SIGTRAP
, которое используется отладчиками, и SIGPOLL
, применяемое механизмом ненадежного асинхронного ввода-вывода. Ни один из них не описан в настоящей книге, поэтому подробности об этих сигналах не включены в табл. 12.3. Таблица 12.3. Значения
si_code
для специальных сигналов Сигнал | si_code | Описание |
---|---|---|
SIGILL | ILL_ILLOPC | Неправильный код операции (opcode). |
ILL_ILLOPC | Неправильный операнд. | |
ILL_ILLOPC | Неправильный режим
| |
ILL_ILLOPC | Неправильная ловушка (trap). | |
ILL_ILLOPC | Привилегированный код операции. | |
ILL_ILLOPC | Привилегированный регистр. | |
ILL_ILLOPC | Внутренняя ошибка стека. | |
ILL_ILLOPC | Ошибка сопроцессора. | |
SIGFPE | FPE_INTDIV | Деление целого на ноль. |
FPE_INTOVF | Переполнение целого. | |
FPE_FLTDIV | Деление числа с плавающей точкой на ноль. | |
FPE_FLTOVF | Переполнение числа с плавающей точкой. | |
FPE_FLTUND | Потеря значимости числа с плавающей точкой. | |
FPE_FLTRES | Неточный результат числа с плавающей точкой. | |
FPE_FLTINV | Неверная операция с плавающей точкой. | |
FPE_FLTSUB | Число с плавающей точкой вне диапазона. | |
SIGSEGV | SEGV_MAPPER | Адрес не отображается на объект. |
SEGV_ACCERR | Неверные права доступа для адреса. | |
SIGBUS | BUS_ADRALN | Неверное выравнивание адреса. |
BUS_ADRERR | Несуществующий физический адрес. | |
BUS_OBJERR | Специфичный для объекта сбой оборудования. | |
SIGCHLD | CLD_EXITED | Дочерний процесс завершен. |
CLD_KILLED | Дочерний процесс уничтожен. | |
CLD_DUMPED | Дочерний процесс уничтожен с выводом дампа памяти в файл. | |
CLD_TRAPPED | Дочерний процесс достиг точки останова. | |
CLD_STOPPED | Дочерний процесс приостановлен. |
Чтобы помочь прояснить разные значения, которые может принимать
si_code
, рассмотрим пример, в котором SIGCHLD
генерируется четырьмя разными способами: kill
, sigqueue
, raise
(использует системный вызов tkill
) и созданием дочернего процесса, который немедленно прерывается. 1: /* sicode.с */
2:
3: #include <sys/signal.h>
4: #include <stdlib.h>
Поделиться:
Популярные книги
Корсар
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Девяностые приближаются
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Жена фаворита королевы. Посмешище двора
Фантастика:
фэнтези
5.00
рейтинг книги
(не)Бальмануг. Дочь 2
8. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Буря империи
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Идеальный мир для Лекаря 13
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Книга пятая: Древний
5. О чем молчат могилы
Фантастика:
фэнтези
городское фэнтези
мистика
7.68
рейтинг книги
Зеркало силы
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Имя нам Легион. Том 5
5. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Аномальный наследник. Том 3
2. Аномальный наследник
Фантастика:
фэнтези
7.74
рейтинг книги
Архил...? 4
4. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
5.50
рейтинг книги
Хозяйка лавандовой долины
2. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Отмороженный 10.0
10. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Ваше Сиятельство 2
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00