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

Какие бывают сигналы в Linux

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

Сигналы в Linux — это механизм межпроцессного взаимодействия, используемый для уведомления процессов о событиях. Основные сигналы включают SIGINT (прерывание), SIGTERM (завершение), SIGKILL (принудительное завершение), SIGSEGV (ошибка сегментации) и SIGCHLD (изменение состояния дочернего процесса). Сигналы могут быть перехвачены и обработаны, за исключением SIGKILL и SIGSTOP.

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

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

Зачем нужны сигналы

Сигналы позволяют процессам взаимодействовать друг с другом и с операционной системой. Например, они могут использоваться для:

  • Прерывания выполнения процесса (например, при нажатии Ctrl+C).
  • Завершения процесса корректным образом.
  • Уведомления процесса о завершении дочернего процесса.
  • Обработки ошибок, таких как ошибки сегментации.

Основные сигналы

  • SIGINT (2): Прерывание процесса. Обычно отправляется, когда пользователь нажимает Ctrl+C в терминале.
  • SIGTERM (15): Запрос на завершение процесса. Процесс может перехватить этот сигнал и выполнить очистку перед завершением.
  • SIGKILL (9): Принудительное завершение процесса. Не может быть перехвачен или проигнорирован.
  • SIGSEGV (11): Ошибка сегментации. Указывает на попытку процесса обратиться к памяти, к которой у него нет доступа.
  • SIGCHLD (17): Уведомление родительского процесса о завершении или изменении состояния дочернего процесса.

Как работают сигналы

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

#include <signal.h>
#include <unistd.h>
​
int main() {
    // Отправка сигнала SIGTERM самому себе
    kill(getpid(), SIGTERM);
    return 0;
}
  • #include <signal.h>: Подключение заголовочного файла, содержащего определения для работы с сигналами.
  • #include <unistd.h>: Подключение заголовочного файла для использования системных вызовов, таких как getpid.
  • kill(getpid(), SIGTERM): Отправка сигнала SIGTERM текущему процессу. getpid() возвращает идентификатор текущего процесса.

Обработка сигналов

Процессы могут перехватывать и обрабатывать сигналы с помощью функции signal. Например:

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

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

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

Твои заметки