Какие основные интерфейсы предоставляет ядро Linux для пользовательских программ?

«Какие основные интерфейсы предоставляет ядро Linux для пользовательских программ?» — вопрос из категории Linux и ОС, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ядро Linux предоставляет несколько уровней абстракции для взаимодействия с пользовательским пространством (user-space). Основные интерфейсы:

  1. Системные вызовы (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
  2. Виртуальные файловые системы /proc и /sys

    • /proc — предоставляет информацию о процессах (PID, память, файловые дескрипторы) и системе в виде файлов (например, /proc/cpuinfo, /proc/meminfo).
    • /sys — интерфейс для взаимодействия с устройствами и настройки параметров ядра и подсистем (например, управление сетевыми интерфейсами, энергосбережением).
  3. Файлы устройств в /dev — интерфейс для работы с драйверами устройств. Например, /dev/sda (блочное устройство — диск), /dev/tty (терминал), /dev/urandom (генератор случайных чисел).

  4. Netlink Socket — специальный механизм IPC для двусторонней связи между ядром и пользовательским пространством. Активно используется утилитами сетевого стека (ip из пакета iproute2).

  5. Системный вызов ioctl() — «универсальный» интерфейс для операций, специфичных для конкретного устройства или драйвера, которые не покрыты стандартными системными вызовами (например, настройка параметров последовательного порта).

  6. Сигналы (Signals) — механизм асинхронных уведомлений, посылаемых ядром или процессами (например, SIGINT (Ctrl+C), SIGSEGV (segmentation fault)).