The book of Magnus

IT-заметки и знания

Системные сигналы и системные вызовы в Linux

Tags = [ Linux, System_signals, System_calls ]

Есть в GNU/Linux два похожих по звучанию, но при этом очень разных по смыслу понятия - системные сигналы и системные вызовы. В Linux сигналы и вызовы играют важную роль в управлении процессами и их взаимодействием с операционной системой. Давай рассмотрим их более подробно.

Системные сигналы

Сигналы — это механизм межпроцессного взаимодействия (IPC, Inter-Process Communication), который используется для асинхронного уведомления процесса о каком-либо событии. Сигналы можно рассматривать как сообщения, которые операционная система отправляет процессам. Каждый сигнал имеет уникальный номер и определённое действие по умолчанию.

Примеры сигналов:

  1. SIGINT (2) — Сигнал прерывания, обычно посылается, когда пользователь нажимает Ctrl+C в терминале.
  2. SIGTERM (15) — Сигнал завершения. Процессу предлагается завершиться корректно.
  3. SIGKILL (9) — Принудительное завершение процесса. Процесс не может игнорировать этот сигнал или обработать его.
  4. SIGHUP (1) — Сигнал обрыва соединения. Используется для уведомления о том, что соединение с терминалом потеряно.
  5. SIGSEGV (11) — Сигнал нарушения доступа. Уведомляет о попытке процесса обратиться к памяти, которая ему не принадлежит.

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

Процесс может:

  • Игнорировать сигнал (кроме SIGKILL и SIGSTOP).
  • Выполнить действие по умолчанию.
  • Перехватить сигнал и выполнить пользовательскую функцию (обработчик сигнала).

Системные вызовы

Системные вызовы (syscalls) — это интерфейс между пользовательским пространством и ядром операционной системы. Процессы используют системные вызовы для выполнения задач, требующих привилегий ядра, таких как доступ к файловой системе, управление памятью и работа с процессами.

Примеры системных вызовов:

  1. fork() — Создание нового процесса, который является копией текущего.
  2. exec() — Замена текущего образа процесса новым (например, запуск новой программы).
  3. wait() — Ожидание завершения дочернего процесса.
  4. exit() — Завершение процесса.
  5. read() и write() — Чтение и запись данных в файлы или устройства.
  6. open() и close() — Открытие и закрытие файлов.

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