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

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

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

21: int main {

22: sigset_t mask;

23: sigset_t oldMask;

24: struct sigaction act;

25: int i;

26:

27: /* Обрабатываемые в программе сигналы */

28: sigemptyset(&mask);

29: sigaddset(&mask, SIGRTMIN);

30: sigaddset(&mask, SIGRTMIN+1);

31: sigaddset(&mask, SIGUSR1);

32:

33: /*
Отправить сигнал handler и сохранять их блокированными,

34: чтобы handler был сконфигурирован во избежание

35: состязаний при манипулировании глобальными переменными */

36: act.sa_handler = handler;

37: act.sa_mask = mask;

38: act.sa_flags = 0;

39:

40: sigaction(SIGRTMIN, &act, NULL);

41: sigaction(SIGRTMIN+1, &act, NULL);

42: sigaction(SIGUSR1, &act, NULL);

43:

44: /* Блокировать сигналы, с которыми мы работаем, чтобы

45: была видна очередность и порядок */

46: sigprocmask(SIG_BLOCK, &mask, &oldMask);

47:

48: /* Генерировать сигналы */

49: raise(SIGRTMIN+1);

50: raise(SIGRTMIN);

51: raise(SIGRTMIN);

52: raise(SIGRTMIN+1);

53: raise(SIGRTMIN);

54: raise(SIGUSR1);

55: raise(SIGUSR1);

56:

57: /* Разрешить доставку этих сигналов. Все они будут доставлены

58: прямо перед возвратом этого вызова (для Linux; это

59: НЕПЕРЕНОСИМОЕ поведение). */

60: sigprocmask(SIG_SETMASK, &oldMask, NULL);

61:

62: /* Отобразить упорядоченный список перехваченных сигналов */

63: printf("Принятые сигналы:\n");

64: for (i = 0; i < nextSig; i++)

65: if (sigOrder[i] < SIGRTMIN)

66: printf("\t%s\n", strsignal(sigOrder[i]));

67: else

68: printf("\tSIGRTMIN + %d\n", sigOrder[i] - SIGRTMIN);

69:

70: return 0;

71: }

Эта программа посылает себе некоторое количество сигналов и выводит на дисплей порядок их получения. Когда сигналы отправляются, она блокирует их, чтобы предотвратить немедленную доставку. Также она блокирует сигналы всякий раз, когда вызывается обработчик, устанавливая значение члена

sa_mask
структуры
struct sigaction
при настройке обработчика для каждого сигнала. Это предотвращает возможное состояние состязаний при обращении к глобальным переменным
nextSig
и
sigOrder
изнутри обработчика.

Запуск этой программы выдаст показанные ниже результаты.

Принятые сигналы:

User defined signal1

SIGRTMIN + 0

SIGRTMIN + 0

SIGRTMIN + 0

SIGRTMIN + 1

SIGRTMIN + 1

Это

показывает, что все сигналы реального времени были доставлены, в то же время, был доставлен только один экземпляр сигнала
SIGUSR1
. Вы также видите изменение порядка сигналов реального времени — все сигналы
SIGRTMIN
были доставлены перед
SIGRTMIN + 1
.

12.7. Дополнительные сведения о сигналах

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

SIGSEGV
), или же иметь возможность включить данные в сигналы, генерируемые приложением. Расширение реального времени Real Time Signals позволяет решить обе эти задачи.

12.7.1. Получение контекста сигнала

Информация о том, как и почему был сгенерирован сигнал, называется контекстом [68] сигнала. Приложения, которые должны видеть этот контекст, используют обработчики сигналов, отличающиеся от нормальных. Они включают два дополнительных параметра — указатель на

siginfo_t
, предоставляющий контекст сигнала, и указатель на
void*
, который может быть использован некоторыми низкоуровневыми системными библиотеками [69] . Вот как выглядит полный прототип такого обработчика.

68

До появления стандарта POSIX приложение могло обращаться к

struct sigcontext
за информацией того же рода, что теперь представляет
siginfo_t
, и термин "контекст" остался от этой старой реализации.

69

Этот третий параметр на самом деле указывает на структуру

struct ucontext
, которая позволяет процессам выполнять полное переключение контекстов в пользовательском пространстве. Данные вопросы выходят за пределы тем, рассматриваемых в настоящей книге, но это хорошо документировано в Single Unix Specification.

void handler(int signum, siginfo_t *siginfo, void *context);

Приложение должно указать ядру на необходимость передачи полной информации о контексте, устанавливая флаг

SA_SIGINFO
члена
sa_mask
структуры
struct sigaction
, применяемой для регистрации обработчика сигнала. Член
sa_handler
также не используется, потому что он является указателем на функцию с другим прототипом. Вместо этого новый член,
sa_sigaction
, указывает на обработчик сигнала с правильным прототипом. Чтобы снизить потребление памяти,
sa_handler
и
sa_sigaction
разрешено использовать один и тот же участок памяти, поэтому только один из двух должен применяться в одно и то же время. Чтобы сделать это прозрачным, библиотека С определяет
struct sigaction
следующим образом.

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

Золушка по имени Грейс

Ром Полина
Фантастика:
фэнтези
8.63
рейтинг книги
Золушка по имени Грейс

Отмороженный 6.0

Гарцевич Евгений Александрович
6. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 6.0

Заставь меня остановиться 2

Юнина Наталья
2. Заставь меня остановиться
Любовные романы:
современные любовные романы
6.29
рейтинг книги
Заставь меня остановиться 2

Бальмануг. (не) Баронесса

Лашина Полина
1. Мир Десяти
Фантастика:
юмористическое фэнтези
попаданцы
5.00
рейтинг книги
Бальмануг. (не) Баронесса

Седьмая жена короля

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Седьмая жена короля

Камень. Книга вторая

Минин Станислав
2. Камень
Фантастика:
фэнтези
8.52
рейтинг книги
Камень. Книга вторая

Неудержимый. Книга IX

Боярский Андрей
9. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IX

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

6 Секретов мисс Недотроги

Суббота Светлана
2. Мисс Недотрога
Любовные романы:
любовно-фантастические романы
эро литература
7.34
рейтинг книги
6 Секретов мисс Недотроги

Приручитель женщин-монстров. Том 3

Дорничев Дмитрий
3. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 3

Странник

Седой Василий
4. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Странник

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

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 7. Часть 4

В зоне особого внимания

Иванов Дмитрий
12. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
В зоне особого внимания

Назад в СССР: 1985 Книга 2

Гаусс Максим
2. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Назад в СССР: 1985 Книга 2