Sobes.tech
Middle
107
questionbank

Какие сигналы существуют в операционной системе Linux?

Ответ от нейросети

sobes.tech AI

POSIX-совместимые сигналы:

  • SIGINT: Запрос прерывания от пользователя (Ctrl+C).
  • SIGTERM: Запрос на завершение программы.
  • SIGKILL: Безусловное завершение программы (нельзя перехватить).
  • SIGQUIT: Запрос на завершение и дамп памяти (Ctrl+\).
  • SIGHUP: Разрыв соединения с управляющим терминалом; перезапуск демона.
  • SIGFPE: Арифметическая ошибка (деление на ноль).
  • SIGSEGV: Нарушение сегментации (обращение к недействительной памяти).
  • SIGBUS: Ошибка шины (неверный доступ к памяти).
  • SIGILL: Недопустимая инструкция.
  • SIGTRAP: Остановка при трассировке/отладке.
  • SIGABRT: Аномальное завершение (например, вызов abort()).
  • SIGUSR1, SIGUSR2: Пользовательские сигналы (для приложений).
  • SIGSTOP: Остановка процесса (нельзя перехватить).
  • SIGTSTP: Остановка процесса от терминала (Ctrl+Z).
  • SIGCONT: Продолжить выполнение остановленного процесса.
  • SIGCHLD: Изменение состояния дочернего процесса.
  • SIGTTIN: Чтение из терминала фоновым процессом.
  • SIGTTOU: Запись в терминал фоновым процессом.
  • SIGPOLL (SIGIO): Доступность ввода/вывода на файловом дескрипторе.
  • SIGPROF: Истечение интервала профилирования.
  • SIGSYS: Ошибка при вызове системной функции.
  • SIGURG: Экстренные данные доступны в сокете.
  • SIGVTALRM: Истечение интервала виртуального таймера.
  • SIGXCPU: Превышение лимита CPU.
  • SIGXFSZ: Превышение лимита размера файла.

Сигналы реального времени: Начинаются с SIGRTMIN и заканчиваются SIGRTMAX. Используются для специфических задач планирования и коммуникации между процессами, их номера зависят от реализации.

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

import signal
import os
import time

def handler(signum, frame):
    # Обработчик сигнала
    print(f"\nReceived signal: {signal.Signals(signum).name}")
    if signum == signal.SIGTERM:
        print("Terminating gracefully...")
        # Здесь может быть код для чистого завершения работы
        exit(0)

# Установка обработчика для SIGTERM и SIGINT
signal.signal(signal.SIGTERM, handler)
signal.signal(signal.SIGINT, handler)

print(f"My PID: {os.getpid()}")
print("Press Ctrl+C or send SIGTERM...")

while True:
    # Программа работает
    time.sleep(1)
    print("Working...")

Отправка сигнала из командной строки:

# Отправить SIGTERM процессу с PID 12345
kill 12345

# Отправить SIGKILL процессу с PID 12345
kill -9 12345

# Отправить SIGINT (аналогично Ctrl+C)
# В другом окне терминала, если процесс запущен не в фоне
# kill -INT <PID>