Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

 long si_band; /* связывающее событие для SIGPOLL/SIGIO */

 union sigval si_value; /* значение сигнала (расширенное) */

} siginfo_t;

Поля

si_signo
,
si_code
и
si_value
доступны для всех сигналов. Другие поля могут быть членами объединения, поэтому должны использоваться лишь для тех сигналов, для которых они определены. В структуре
siginfo_t
могут быть также и другие поля.

Почти все поля предназначены для расширенного использования. Все подробности содержатся в стандарте POSIX и справочной странице sigaction(2). Однако, мы можем описать простое использование поля

si_code
.

Для

SIGBUS
,
SIGCHLD
,
SIGFPE
,
SIGILL
,
SIGPOLL
,
SIGSEGV
и
SIGTRAP
поле si_code может принимать любое из набора предопределенных значений, специфичных для каждого сигнала, указывая на причину появления сигнала. Откровенно говоря, детали несколько чрезмерны; повседневному коду на самом деле нет необходимости иметь с ними дела (хотя позже мы рассмотрим значения для
SIGCHLD
). Для всех остальных сигналов член
si_code
имеет одно из значений из табл. 10.4.

Таблица 10.4. Значения происхождения сигнала для

si_code

Значение Только GLIBC Смысл
SI_ASYNCIO
Асинхронный ввод/вывод завершен (расширенный).
SI_KERNEL
Сигнал послан ядром.
SI_MESGQ
Состояние очереди сообщений изменилось (расширенный.)
SI_QUEUE
Сигнал послан из
sigqueue
(расширенный).
SI_SIGIO
SIGIO
поставлен в очередь (расширенный).
SI_TIMER
Время таймера истекло
SI_USER
Сигнал послан функцией
kill
.
raise
и
abort
также могут его вызвать, но это не обязательно.

В особенности полезно значение

SI_USER
; оно позволяет обработчику сигнала сообщить, был ли сигнал послан функциями
raise
или
kill
(описываются далее). Вы можете использовать эту информацию, чтобы избежать повторного вызова
raise
или
kill
.

Третий аргумент обработчика сигнала с тремя аргументами,

void *contex
t, является расширенной возможностью, которая больше не обсуждается в данной книге.

Наконец, чтобы увидеть

sigaction
в действии, исследуйте полный исходный код обработчика сигнала для
sort.c
:

2074 static void

2075 sighandler(int sig)

2076 {

2077 #ifndef SA_NOCLDSTOP /* В системе старого стиля... */

2078 signal(sig, SIG_IGN); /* - для игнорирования sig используйте signal*/

2079 #endif - /* В противном случае sig автоматически блокируется */

2080

2081 cleanup; /* Запуск кода очистки */

2082

2083 #ifdef SA_NOCLDSTOP /* В системе в стиле POSIX... */

2084 {

2085 struct sigaction sigact;

2086

2087 sigact.sa_handler = SIG_DFL; /* - Установить действие по умолчанию */

2088 sigemptyset(&sigact.sa_mask); /* - Нет дополнительных сигналов для блокирования */

2089 sigact.sa_flags = 0; /* - Специальные действия не предпринимаются */

2090 sigaction(sig, &sigact, NULL); /* - Поместить на место */

2091 }

2092 #else /* На системе в старом стиле... */

2093 signal(sig, SIG_DFL); /* - Установить действие по умолчанию */

2094 #endif

2095

2096 raise(sig); /* Повторно послать сигнал */

2097 }

Вот код в

main
, который помещает обработчик на свое место:

2214 #ifdef SA_NOCLDSTOP /* На системе POSIX... */

2215 {

2216 unsigned i;

2217 sigemptyset(&caught_signals);

2218 for (i = 0; i < nsigs; i++) /* - Блокировать все сигналы */

2219 sigaddset(&caught_signals, sigs[i]);

2220 newact.sa_handler = sighandler; /* - Функция обработки сигнала */

2221 newact.sa_mask = caught_signals; /* - Установить для обработчика маску сигналов процесса */

2222 newact.sa_flags =0; /* - Особых флагов нет */

2223 }

2224 #endif

2225

2226 {

2227 unsigned i;

2228 for (i = 0; i < nsigs; i++) /* Для всех сигналов... */

2229 {

2230 int sig = sigs[i];

2231 #ifdef SA_NOCLDSTOP

2232 sigaction(sig, NULL, &oldact); /* - Получить старый обработчик */

2233 if (oldact.sa_handler != SIG_IGN) /* - Если этот сигнал не игнорируется */

2234 sigaction(sig, &newact, NULL); /* - Установить наш обработчик */

Поделиться:
Популярные книги

Первый среди равных. Книга X

Бор Жорж
10. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Первый среди равных. Книга X

Мастер порталов

Лисина Александра
8. Гибрид
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер порталов

Шайтан Иван 6

Тен Эдуард
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
7.00
рейтинг книги
Шайтан Иван 6

Моров. Том 3

Кощеев Владимир
2. Моров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Моров. Том 3

Я до сих пор не князь. Книга XVI

Дрейк Сириус
16. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я до сих пор не князь. Книга XVI

Вернувшийся: Посол. Том IV

Vector
4. Вернувшийся
Фантастика:
космическая фантастика
киберпанк
5.00
рейтинг книги
Вернувшийся: Посол. Том IV

На границе империй. Том 7

INDIGO
7. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
6.75
рейтинг книги
На границе империй. Том 7

Хозяин оков V

Матисов Павел
5. Хозяин Оков
Фантастика:
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Хозяин оков V

Петля, Кадетский корпус. Книга первая

Алексеев Евгений Артемович
1. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
6.11
рейтинг книги
Петля, Кадетский корпус. Книга первая

Мое ускорение

Иванов Дмитрий
5. Девяностые
Фантастика:
попаданцы
альтернативная история
6.33
рейтинг книги
Мое ускорение

Кодекс Охотника. Книга XXXVIII

Винокуров Юрий
38. Кодекс Охотника
Фантастика:
фэнтези
боевая фантастика
попаданцы
юмористическое фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVIII

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Я царь. Книга XXVIII

Дрейк Сириус
28. Дорогой барон!
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Я царь. Книга XXVIII

Воплощение Похоти

Некрасов Игорь
1. Воплощение Похоти
Фантастика:
юмористическое фэнтези
попаданцы
рпг
аниме
5.00
рейтинг книги
Воплощение Похоти