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

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

Жанры

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

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

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Бракованная невеста. Академия драконов

Милославская Анастасия
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Бракованная невеста. Академия драконов

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

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

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Шаман. Похищенные

Калбазов Константин Георгиевич
1. Шаман
Фантастика:
боевая фантастика
попаданцы
6.44
рейтинг книги
Шаман. Похищенные

Совок

Агарев Вадим
1. Совок
Фантастика:
фэнтези
детективная фантастика
попаданцы
8.13
рейтинг книги
Совок

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

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

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

Ведьма Вильхельма

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

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

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

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Плохая невеста

Шторм Елена
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Плохая невеста