Есть в GNU/Linux два похожих по звучанию, но при этом очень разных по смыслу понятия - системные сигналы и системные вызовы. В Linux сигналы и вызовы играют важную роль в управлении процессами и их взаимодействием с операционной системой. Давай рассмотрим их более подробно.
Системные сигналы
Сигналы — это механизм межпроцессного взаимодействия (IPC, Inter-Process Communication), который используется для асинхронного уведомления процесса о каком-либо событии. Сигналы можно рассматривать как сообщения, которые операционная система отправляет процессам. Каждый сигнал имеет уникальный номер и определённое действие по умолчанию.
Примеры сигналов:
- SIGINT (2) — Сигнал прерывания, обычно посылается, когда пользователь нажимает
Ctrl+Cв терминале. - SIGTERM (15) — Сигнал завершения. Процессу предлагается завершиться корректно.
- SIGKILL (9) — Принудительное завершение процесса. Процесс не может игнорировать этот сигнал или обработать его.
- SIGHUP (1) — Сигнал обрыва соединения. Используется для уведомления о том, что соединение с терминалом потеряно.
- SIGSEGV (11) — Сигнал нарушения доступа. Уведомляет о попытке процесса обратиться к памяти, которая ему не принадлежит.
Обработка сигналов:
Процесс может:
- Игнорировать сигнал (кроме SIGKILL и SIGSTOP).
- Выполнить действие по умолчанию.
- Перехватить сигнал и выполнить пользовательскую функцию (обработчик сигнала).
Системные вызовы
Системные вызовы (syscalls) — это интерфейс между пользовательским пространством и ядром операционной системы. Процессы используют системные вызовы для выполнения задач, требующих привилегий ядра, таких как доступ к файловой системе, управление памятью и работа с процессами.
Примеры системных вызовов:
- fork() — Создание нового процесса, который является копией текущего.
- exec() — Замена текущего образа процесса новым (например, запуск новой программы).
- wait() — Ожидание завершения дочернего процесса.
- exit() — Завершение процесса.
- read() и write() — Чтение и запись данных в файлы или устройства.
- open() и close() — Открытие и закрытие файлов.
Сигналы предоставляют простой и эффективный способ управления процессами, особенно в случае неожиданных событий. Системные вызовы, с другой стороны, обеспечивают процессам возможность взаимодействовать с ядром операционной системы и выполнять различные операции на уровне системы. Оба механизма являются ключевыми компонентами операционной системы Linux и широко используются в программировании.