Сигналы реального времени
Приложениям реального времени требуются средства надежного, детерминированного, асинхронного извещения (уведомления) о событиях. Для удовлетворения этой потребности механизм сигналов был расширен, а в стандарт была введена необязательная часть, получившая название "сигналы реального времени" (Realtime Signals Extension, RTS).
Номера сигналов реального времени лежат в диапазоне от SIGRTMIN до SIGRTMAX. Всего таких сигналов должно быть не меньше, чем RTSIG_MAX.
"Жизненный цикл" сигналов реального времени состоит из четырех фаз:
- генерация;
- ожидание;
- доставка;
- обработка.
Сигналы реального времени могут генерироваться при срабатывании высокоточных таймеров, завершении операции асинхронного ввода/вывода, поступлении межпроцессного сообщения, выполнении функции sigqueue() и т.д.
На фазе генерации сигналов центральную роль играет структура типа sigevent, которая, помимо прочего, определяет способ уведомления и значение сигнала.
Стандартом POSIX-2001 предусмотрено три способа уведомления об асинхронных событиях: SIGEV_NONE (отсутствие уведомления), SIGEV_SIGNAL (генерация сигнала с возможной постановкой в очередь к процессу) и SIGEV_THREAD (вызов функции).
Значение сигнала реального времени может быть целым числом или указателем.
Сгенерировать сигнал реального времени можно, обратившись к функции sigqueue().
После того, как сигнал сгенерирован, наступает фаза ожидания. Сигналы одного типа ставятся в очередь к процессу в порядке генерации.
Дождаться доставки сигнала реального времени можно с помощью функций sigwaitinfo() и sigtimedwait().
При наличии нескольких неблокированных ждущих сигналов реального времени, их доставка процессу производится в порядке возрастания номеров. Тем самым поддерживается ранжированная по приоритетам доставка уведомлений.
Для приложений реального времени, функционирующих на аппаратных конфигурациях с ограниченными ресурсами, может оказаться полезной возможность (распространяющаяся на все сигналы) выполнять функции обработки сигналов не на основном, а на альтернативном стеке. Функция sigaltstack() позволяет установить и/или опросить характеристики альтернативного стека.
Обработка сигналов (не обязательно реального времени) нередко сочетается с нелокальными переходами. В таких случаях могут оказаться полезными функции sigsetjmp() и siglongjmp().