Шрифт:
Приведем несколько небольших и самых простых примеров использования модели надежных сигналов.
1. Перехватчик сигнала
32
Инициализации, используемые в примерах вида
Результатом нормального (без вмешательства оператора) выполнения приложения будет последовательность из 20 циклов секундных ожиданий, но если в процессе этих ожиданий пользователь пытается прервать работу процесса по [Ctrl+C], то он получит вывод, подобный следующему:
2. Запрет прерывания выполнения программы с терминала. Для этого достаточно заменить строку инициализации структуры
Можно проигнорировать сразу несколько сигналов (прерывающих выполнение программы с клавиатуры):
Далее остановимся еще на одном вызове API-сигналов, который широко используется в этой и последующих моделях обработки (сигналы реального времени, реакция в потоках):
Этот вызов позволяет прочитать текущее значение (если
•
•
•
•
•
•
Как и большинство сигнальных функций, данная функция возвращает нулевое значение в результате успешного выполнения и -1 в случае неудачи, при этом код ошибки устанавливается в
Именно эта функция снимает одно из самых существенных ограничений, свойственных модели «ненадежных сигналов», — позволяет заблокировать реакцию на сигналы при выполнении критических участков кода и восстановить ее при завершении выполнения этих участков.
Модель сигналов реального времени
Сигналы реального времени были добавлены в POSIX относительно недавно (1996 г.). Эта новая модель в различных ОС UNIX реализуется с разной степенью полноты и с отклонениями от спецификаций, и QNX не исключение. Модель еще до конца не отработана, поэтому возможны сюрпризы (и сейчас они будут).
Модель сигналов реального времени, которую специфицирует POSIX, устанавливается флагом
1. Сигналы, называемые сигналами реального времени, могут принимать значения между