Модель сигналов реального времени, которую специфицирует POSIX, устанавливается флагом SA_SIGINFO
sigaction(). В нижеследующем перечислении того, что предусматривает эта модель, мы излагаем в первую очередь качественную картину происходящего, предлагаемую POSIX, кое-где уточняя ее конкретными данными реализации QNX (артефакты в поведении QNX будут отдельно отмечены позже):1. Сигналы, называемые сигналами реального времени, могут принимать значения между SIGRTMIN
SIGRTMAX. Количество таких сигналов определяется в системе константой RTSIG_MAX, которая должна быть не менее 8 (POSIX). В QNX: SIGRTMIN = 41, SIGRTMAX = 56.2. Обработка сигналов реального времени строится на основе очереди. Если сигнал порожден N раз, то он должен быть и N раз получен адресатом (в описываемых ранее моделях это не так, в них процесс получает только единичный экземпляр сигнала). Повторные экземпляры одного и того же сигнала в модели реального времени доставляются обработчику в порядке FIFO.
3. Помимо 8-битного кода с сигналом реального времени ассоциируется 32-битное значение (si_value
4. Для работы с сигналами реального времени добавлено несколько новых функций. В частности, в этой модели для отправки сигнала некоторому процессу используется sigqueue()
kill().Эти два вызова определяются очень близкими формами:
int kill(pid_t pid, int signo);
int sigqueue(pid_t pid, int signo, const union sigval value);
Как мы вскоре увидим, эти две синтаксические формы одного и того же вызова отличаются лишь тем, помещают ли они в сигнал указанное значение или оставляют его нулевым. Если процесс устанавливает обработку сигнала на основании очереди, он будет получать почти одинаковым образом сигналы, посланные обоими вызовами. Разница «почти» состоит в том, что получатель на основании анализа поля si_code
siginfo_t в состоянии отличить, каким вызовом ему был послан сигнал.При ошибке выполнения sigqueue()
• EAGAIN
• EINVAL
signo или неподдерживаемый сигнал;• ENOSYS
sigqueue() не поддерживается реализацией (возможно, версией);• EPERM
• ESRCH
Последний случай особо интересен, так как при указании в качестве номера сигнала signo = 0
5. Когда в очередь помещаются различные не заблокированные процессом (потоком) сигналы в диапазоне SIGRTMIN
SIGRTMAX, то сигналы с меньшими номерами доставляются обработчику из FIFO-очереди раньше сигналов с большими номерами (то есть сигналы с меньшими номерами имеют более высокий приоритет).6. Обработчик для сигналов реального времени устанавливается с флагом SA_SIGINFO
void func(int signo, siginfo_t* info, void* context);
Обработчик имеет больше параметров и получает больше информации. POSIX требует, чтобы тип siginfo_t
typedef struct {
int si_signo;
int si_code;