Сигналы
100%

Процессы · Урок 6

Сигналы

Узнайте, как Linux порождает, блокирует, доставляет и обрабатывает сигналы для управления процессами и уведомления о событиях.

Сигнал — асинхронное уведомление, доставляемое процессу или конкретному потоку. Сигналы сообщают о событиях и запрашивают действия, но переносят лишь ограниченные сведения по сравнению с ориентированными на данные механизмами межпроцессного взаимодействия.

Источники сигналов

Сигналы могут происходить из нескольких источников:

  • Терминал может породить SIGINT для Ctrl-C или SIGTSTP для Ctrl-Z и направить его группе процессов переднего плана.
  • Ядро может породить синхронный сигнал, например SIGSEGV, когда поток обращается к недопустимой памяти.
  • Процесс может отправить разрешённый сигнал другому процессу или группе процессов.
  • Таймеры, изменения состояния потомка и разрывы терминала могут порождать другие сигналы.

Отправитель должен иметь соответствующее разрешение, обычно основанное на учётных данных или capabilities. Поэтому сигналы — управляемый ядром интерфейс контроля, а не неограниченные сообщения между произвольными пользователями.

Какой сигнал терминал обычно порождает для Ctrl-C?

Обработчики и стандартные действия

У большинства сигналов есть общая для процесса disposition, выбирающая один из трёх ответов:

  • выполнить определённое для сигнала стандартное действие
  • игнорировать сигнал
  • вызвать установленный пользователем обработчик

Стандартные действия различаются: сигнал может завершить процесс, завершить его с созданием дампа ядра, остановить, продолжить или быть проигнорирован. Перехват SIGTERM позволяет программе начать нормальное завершение, но обработчик обязан соблюдать строгие правила async-signal-safety, а программа всё равно может задержать выход или отказаться от него.

Имена сигналов переносимее и понятнее чисел. Хотя распространённые архитектуры Linux используют для SIGTERM число 15, не предполагайте, что все номера, кроме гарантированных соответствующим стандартом, везде одинаковы. Проверяйте локальное сопоставление через kill -l.

Почему процесс может нормально отреагировать на SIGTERM?

Заблокированные и ожидающие сигналы

У потоков есть маски сигналов, способные временно блокировать доставку выбранных сигналов. Порождённый заблокированный сигнал остаётся ожидающим, пока доставка не станет возможной, с учётом правил стандартных и real-time сигналов. Стандартные сигналы одного типа могут объединяться, а не вставать в очередь по одному на каждое событие.

В многопоточном процессе направленный процессу сигнал может быть доставлен подходящему потоку, который его не блокирует; направленный потоку сигнал предназначен указанному потоку. Поэтому правильная схема сигналов требует большего, чем проверка того, «заблокировал ли процесс сигнал».

Что обычно происходит, если блокируемый сигнал порождён, пока цель его блокирует?

Сигналы, которые нельзя обработать

SIGKILL завершает процесс, а SIGSTOP останавливает его. Ни один из них нельзя перехватить, игнорировать или заблокировать. Это гарантирует конечный контроль ядра, но также означает, что SIGKILL не даёт приложению возможности выполнить очистку.

Даже SIGKILL может не заставить задачу мгновенно исчезнуть для наблюдателя. Задача может ожидать в непрерываемой операции ядра, а после завершения её родитель всё равно должен собрать статус.

Какую пару нельзя перехватить, игнорировать или заблокировать?

Урок завершён

Вы завершили Сигналы

Теперь вы можете объяснить основные этапы и ограничения обработки сигналов Linux.

  • Определяйте сигналы, порождённые терминалом, ядром и процессами.

  • Отличайте стандартные действия, игнорирование и обработчики.

  • Связывайте блокировку с ожидающей доставкой и масками потоков.

  • Помните, что SIGKILL и SIGSTOP нельзя обработать или заблокировать.

Сохраните прогресс

Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.

Создать бесплатный аккаунт
Следующий Урок
Назад к Процессы