Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад

Что произойдёт, если во время обработки одного сигнала придёт ещё один такой же?

Проверяет понимание реентерабельности и обработки сигналов в Unix-подобных системах.

Короткий ответ

Если во время обработки сигнала приходит ещё один такой же, он обычно блокируется до завершения текущего обработчика. Система автоматически добавляет сигнал в маску blocked, чтобы предотвратить рекурсивный вызов. После выхода из обработчика сигнал доставляется снова. Это поведение гарантирует, что обработчик не будет прерван самим собой.

Длинный ответ

Поведение сигналов при повторном поступлении

В Unix-подобных системах, когда процесс обрабатывает сигнал, ядро автоматически блокирует доставку того же самого сигнала до завершения текущего обработчика. Это сделано для предотвращения рекурсивных вызовов и обеспечения безопасности асинхронного кода.

Механизм блокировки

При входе в обработчик сигнала ядро добавляет этот сигнал в маску blocked сигналов процесса. Если во время выполнения обработчика поступает ещё один такой же сигнал, он не теряется, а помещается в очередь ожидания. После выхода из обработчика маска восстанавливается, и сигнал доставляется снова.

Пример на C

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

void handler(int sig) {
    printf("Signal %d received\n", sig);
    sleep(3);  // Имитация долгой обработки
    printf("Handler finished\n");
}

int main() {
    signal(SIGINT, handler);
    while(1) pause();
    return 0;
}

Если дважды нажать Ctrl+C во время выполнения sleep, второй сигнал будет заблокирован и обработан после завершения первого вызова handler.

Исключения и особенности

  • Сигналы SIGKILL и SIGSTOP нельзя блокировать или игнорировать.
  • Для сигналов, не поддерживающих очереди (стандартные сигналы), если несколько одинаковых сигналов приходят подряд, может быть доставлен только один.
  • Реальные сигналы (SIGRTMIN...SIGRTMAX) поддерживают очереди и не теряются.

Вывод

Понимание этого механизма критично для написания надёжных обработчиков сигналов, особенно в серверных приложениях и демонах, где важна корректная обработка асинхронных событий без состояния гонки.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Networks

  • Linux

    Linux

Ключевые слова

#signals

#reentrancy

#signal handler

#blocking signals

#async signal safety

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.