← Назад ко всем вопросам

Какие знаешь виды сигналов в Linux

1️⃣ Как кратко ответить

В Linux сигналы делятся на стандартные и реалтаймовые. Стандартные сигналы, такие как SIGINT, SIGTERM, SIGKILL, используются для управления процессами, например, для их завершения или приостановки. Реалтаймовые сигналы (SIGRTMIN до SIGRTMAX) обеспечивают более гибкую обработку, поддерживая очереди и приоритеты.

2️⃣ Подробное объяснение темы

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

Стандартные сигналы

Стандартные сигналы — это предопределенные сигналы, которые имеют фиксированные значения и предназначены для выполнения определенных действий. Вот некоторые из них:

  • SIGINT (2): Посылается, когда пользователь прерывает процесс с клавиатуры (обычно с помощью Ctrl+C).
  • SIGTERM (15): Запрос на завершение процесса. Процесс может обработать этот сигнал и завершиться корректно.
  • SIGKILL (9): Немедленное завершение процесса. Этот сигнал не может быть перехвачен или проигнорирован.
  • SIGSTOP (19): Приостановка процесса. Процесс может быть возобновлен с помощью SIGCONT.
  • SIGCONT (18): Возобновление приостановленного процесса.

Реалтаймовые сигналы

Реалтаймовые сигналы были введены для преодоления ограничений стандартных сигналов. Они обеспечивают более гибкую и мощную обработку сигналов:

  • Диапазон: Реалтаймовые сигналы имеют диапазон от SIGRTMIN до SIGRTMAX. Точное количество зависит от системы, но обычно это около 32 сигналов.
  • Очереди: В отличие от стандартных сигналов, которые могут быть потеряны, если они посылаются несколько раз до обработки, реалтаймовые сигналы поддерживают очереди. Это значит, что все посланные сигналы будут обработаны.
  • Приоритеты: Реалтаймовые сигналы имеют приоритеты, что позволяет обрабатывать их в определенном порядке.

Пример использования сигналов

Рассмотрим простой пример программы на C, которая обрабатывает сигнал SIGINT:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
​
// Обработчик сигнала SIGINT
void handle_sigint(int sig) {
    printf("Caught signal %d\n", sig);
    exit(0);
}
​
int main() {
    // Устанавливаем обработчик для SIGINT
    signal(SIGINT, handle_sigint);
​
    // Бесконечный цикл, ожидающий сигнал
    while (1) {
        printf("Running...\n");
        sleep(1);
    }
​
    return 0;
}
  • #include <signal.h>: Подключение заголовочного файла для работы с сигналами.
  • void handle_sigint(int sig): Функция-обработчик, которая будет вызвана при получении сигнала SIGINT.
  • signal(SIGINT, handle_sigint): Установка обработчика для сигнала SIGINT.
  • while (1): Бесконечный цикл, который будет выполняться до получения сигнала.
  • sleep(1): Задержка в 1 секунду между итерациями цикла.

Этот код демонстрирует, как можно перехватывать и обрабатывать сигналы в программе. При нажатии Ctrl+C программа завершится, вызвав обработчик handle_sigint.

Тема: Linux / Unix
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки