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

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

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:
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); /* - Установить наш обработчик */

2235 #else

2236 if (signal(sig, SIG_IGN) != SIG_IGN)

2237 signal(sig, sighandler); /* - Та же логика со старым API */

2238 #endif

2239 }

2240 }

Мы заметили, что строки 2216–2219 и 2221 могут быть замещены одним вызовом:

sigfillset(&newact.sa_mask)
;

Мы не знаем, почему код написан именно таким способом.

Интерес представляют также строки 2233–2234 и 2236–2237, которые показывают правильный способ проверки того, игнорируется ли сигнал, и для установки обработчика лишь в том случае, если сигнал не игнорируется.

ЗАМЕЧАНИЕ. Функции API

sigaction
и
signal
не должны использоваться вместе для одного и того же сигнала. Хотя POSIX идет на большие длинноты, чтобы сначала сделать возможным использование
signal
, получить
struct sigaction
, представляющую диспозицию
signal
, и восстановить ее, все равно это плохая мысль. Код будет гораздо проще читать, писать и понимать, если вы используете одну функцию или другую взаимоисключающим образам

10.6.5. Извлечение ожидающих сигналов:

sigpending

Описанный ранее системный вызов

sigpending
позволяет получить набор ожидающих сигналов, т.е тех сигналов, которые появились, но еще не доставлены из-за блокировки:

#include <signal.h> /* POSIX */

int sigpending(sigset_t *set);

Помимо разблокировки ожидающих сигналов, чтобы они могли быть доставлены, вы можете решить их игнорировать. Установка действия сигнала

SIG_IGN
вызывает сбрасывание сигнала (даже если он был заблокирован). Сходным образом для тех сигналов, действием по умолчанию для которых является их игнорирование, установка действия в
SIG_DFL
также вызывает сбрасывание таких ожидающих сигналов.

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

Телохранитель Генсека. Том 3

Алмазный Петр
3. Медведев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Телохранитель Генсека. Том 3

Матабар. II

Клеванский Кирилл Сергеевич
2. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар. II

Второгодка. Книга 2. Око за око

Ромов Дмитрий
2. Второгодка
Фантастика:
героическая фантастика
альтернативная история
фэнтези
5.00
рейтинг книги
Второгодка. Книга 2. Око за око

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес

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

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

Адепт. Том второй. Каникулы

Бубела Олег Николаевич
7. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.05
рейтинг книги
Адепт. Том второй. Каникулы

Кровь на клинке

Трофимов Ерофей
3. Шатун
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.40
рейтинг книги
Кровь на клинке

Перекресток судеб

Щепетнов Евгений Владимирович
6. Нед
Фантастика:
фэнтези
8.84
рейтинг книги
Перекресток судеб

Охотник на демонов

Шелег Дмитрий Витальевич
2. Живой лёд
Фантастика:
боевая фантастика
5.83
рейтинг книги
Охотник на демонов

Чехов книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Чехов книга 3

Академия

Щепетнов Евгений Владимирович
3. Петр Синельников
Фантастика:
фэнтези
6.20
рейтинг книги
Академия

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VII

Гардемарин

Панченко Андрей Алексеевич
1. Андреевский флаг
Фантастика:
попаданцы
альтернативная история
7.14
рейтинг книги
Гардемарин