Ответ
Ядро Linux предоставляет несколько уровней абстракции для взаимодействия с пользовательским пространством (user-space). Основные интерфейсы:
-
Системные вызовы (System Calls) — это основной низкоуровневый API. Программы на C/C++ вызывают обёртки библиотеки glibc (например,
open(),read(),write(),fork(),execve()), которые в итоге выполняют переход в режим ядра.#include <fcntl.h> #include <unistd.h> int fd = open("/home/user/file.txt", O_RDONLY); // Системный вызов open char buffer[128]; ssize_t bytes_read = read(fd, buffer, sizeof(buffer)); // Системный вызов read close(fd); // Системный вызов close -
Виртуальные файловые системы
/procи/sys/proc— предоставляет информацию о процессах (PID, память, файловые дескрипторы) и системе в виде файлов (например,/proc/cpuinfo,/proc/meminfo)./sys— интерфейс для взаимодействия с устройствами и настройки параметров ядра и подсистем (например, управление сетевыми интерфейсами, энергосбережением).
-
Файлы устройств в
/dev— интерфейс для работы с драйверами устройств. Например,/dev/sda(блочное устройство — диск),/dev/tty(терминал),/dev/urandom(генератор случайных чисел). -
Netlink Socket — специальный механизм IPC для двусторонней связи между ядром и пользовательским пространством. Активно используется утилитами сетевого стека (
ipиз пакетаiproute2). -
Системный вызов
ioctl()— «универсальный» интерфейс для операций, специфичных для конкретного устройства или драйвера, которые не покрыты стандартными системными вызовами (например, настройка параметров последовательного порта). -
Сигналы (Signals) — механизм асинхронных уведомлений, посылаемых ядром или процессами (например,
SIGINT(Ctrl+C),SIGSEGV(segmentation fault)).