Добавил:
north memphis Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
doklad (3).docx
Скачиваний:
0
Добавлен:
17.07.2026
Размер:
27.09 Кб
Скачать

МИНОБРНАУКИ РОССИИ

САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ

ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)

Кафедра информационной безопасности

Реферат

по дисциплине «Системы реального времени»

Тема: Механизм сигналов

Студент _________________

Преподаватель _________________ Сидельников В.В.

Санкт-Петербург

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).

Соседние файлы в предмете Системы реального времени