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

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

Жанры

Разработка приложений в среде 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.0

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

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Ермак. Телохранитель

Матабар IV

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

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Свет Черной Звезды

Звездная Елена
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Свет Черной Звезды

Кодекс Крови. Книга IV

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

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад