- •Основная часть Механизм сигналов
- •Сигналы общего назначения и сигналы реального времени
- •Структура sigaction и функция sigaction()
- •Маскирование сигналов (signal masking)
- •Передача сигнала между потоками и возможности передачи данных
- •Синхронный и асинхронный приём сигналов
- •Вопросы асинхронной безопасности
- •Заключение
- •Список источников
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра информационной безопасности
Реферат
по дисциплине «Системы реального времени»
Тема: Механизм сигналов
Студент _________________
Преподаватель _________________ Сидельников В.В.
Санкт-Петербург
2026
Основная часть Механизм сигналов
Механизм сигналов — это стандартный способ уведомления процесса (или потока) о наступлении некоторого события: аппаратной ошибке, истечении тайм-аута, пользовательском прерывании или сообщении от другого процесса/потока. Сигналы обеспечивают асинхронную коммуникацию между компонентами системы и широко используются в POSIX-совместимых ОС, включая Linux и реальном-временные расширения POSIX.
Сигналы общего назначения и сигналы реального времени
Сигналы общего назначения — заранее определённый набор сигналов (например, SIGINT, SIGTERM, SIGSEGV, SIGALRM и т. п.), каждый из которых обычно имеет имя, номер и действие по умолчанию (terminate, core dump, ignore и т.д.). Эти сигналы используются для типичных событий: SIGINT посылается при нажатии Ctrl+C, SIGKILL заставляет немедленно завершить процесс.
Сигналы реального времени (realtime signals) — расширение POSIX (SIGRTMIN…SIGRTMAX). Их основные отличия от обычных:
Поддержка очередей: несколько посылок одного и того же реального-временного сигнала не теряются — они ставятся в очередь и обрабатываются последовательно; для обычных сигналов, если они не обрабатываются, сохраняется только факт последней посылки; прежние посылки теряются
Возможность передачи дополнительных данных (целого или указателя) вместе с сигналом (через sigqueue()/sigval)
Порядок доставки: сигналы реального времени имеют приоритеты, связанные с их номерами (в POSIX более высокий номер — более высокий приоритет)
Эти свойства делают сигналы реального времени надёжными для обмена краткими сообщениями и уведомлениями с гарантией доставки и передачи данных.
Формирование и отправка сигналов
Сигнал может быть сформирован ядром (аппаратная ошибка, таймер), самим процессом или другим процессом/потоком через API.
kill(pid, sig) — стандартный способ отправить сигнал процессу (или группе процессов). kill(0, 0) используется для проверки существования процесса; права на отправку сигнала проверяются по UID.
sigqueue(pid, sig, union sigval) — позволяет отправить сигнал процессу с передачей данных (sival_int или sival_ptr). Ограничения: очередь и ресурсы ядра — сигналы реального времени могут быть поставлены в очередь, но при исчерпании ресурсов вызов может вернуть ошибку. Рекомендуется для передачи данных вместе с сигналом.
В многопоточных приложениях есть аналоги для адресации потоков: pthread_kill(thread, sig) отправляет сигнал конкретному потоку, а pthread_sigqueue() аналогичен sigqueue() но адресует поток. Причина — в многопоточном процессе сигналы обычно доставляются любому не заблокированному потоку, поэтому для точной адресации используют pthread_kill.
Пример: если поток-отправитель хочет уведомить конкретный поток-приёмник и передать небольшой код события, он может вызвать pthread_sigqueue(receiver_tid, SIGRTMIN+1, (union sigval){ .sival_int = 42 }). Приёмник, ожидая сигнала реального времени, прочитает переданное значение через siginfo_t.si_value.
Структура sigaction и функция sigaction()
Для установки обработчика сигнала POSIX рекомендует использовать структуру struct sigaction и вызов sigaction() (вместо устаревшей signal()), так как sigaction() даёт точный контроль над поведением.
Ключевые поля struct sigaction:
sa_handler — указатель на простой обработчик void handler(int), или специальные значения SIG_DFL/SIG_IGN;
sa_sigaction — альтернативный обработчик void handler(int, siginfo_t *, void *), используемый, когда установлен флаг SA_SIGINFO (позволяет получить siginfo_t с источником и переданными данными);
sa_mask — маска сигналов, которые будут временно блокироваться во время выполнения обработчика;
sa_flags — флаги управления, например SA_SIGINFO, SA_RESTART, SA_NODEFER и др.
sigaction(sig, &new_act, &old_act) атомарно устанавливает новый обработчик и позволяет сохранить старый. Использование SA_SIGINFO и sa_sigaction обязательно, если требуется разбирать siginfo_t (например, чтобы узнать PID отправителя или si_value).
