Проверяет понимание реентерабельности и обработки сигналов в Unix-подобных системах.
В Unix-подобных системах, когда процесс обрабатывает сигнал, ядро автоматически блокирует доставку того же самого сигнала до завершения текущего обработчика. Это сделано для предотвращения рекурсивных вызовов и обеспечения безопасности асинхронного кода.
При входе в обработчик сигнала ядро добавляет этот сигнал в маску blocked сигналов процесса. Если во время выполнения обработчика поступает ещё один такой же сигнал, он не теряется, а помещается в очередь ожидания. После выхода из обработчика маска восстанавливается, и сигнал доставляется снова.
#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.
Понимание этого механизма критично для написания надёжных обработчиков сигналов, особенно в серверных приложениях и демонах, где важна корректная обработка асинхронных событий без состояния гонки.