Какие бывают сигналы в 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.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться