← Назад к вопросам

Что такое /proc в Linux?

2.0 Middle🔥 112 комментариев
#Linux и операционные системы

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Что такое /proc в Linux?

/proc — это виртуальная файловая система в Linux, которая предоставляет интерфейс к информации о ядре и процессах. Это не реальные файлы на диске, а динамически генерируемое представление внутреннего состояния системы.

Основные характеристики

Виртуальная файловая система: /proc не занимает место на диске. Данные генерируются в реальном времени ядром на основе текущего состояния системы.

# Проверка типа
df /proc  # Показывает "proc" как тип
ls -la /proc  # Выглядит как обычная директория

Структура /proc

1. Информация о процессах

Каждый процесс имеет директорию с его PID (Process ID):

/proc/[pid]/
/proc/1234/           # Информация о процессе с PID 1234
/proc/1234/cmdline    # Командная строка процесса
/proc/1234/status     # Статус процесса (RSS, VSZ, состояние...)
/proc/1234/maps       # Карта памяти процесса
/proc/1234/fd/        # Открытые файловые дескрипторы
/proc/1234/cwd        # Текущая рабочая директория

Пример использования:

# Получить командную строку процесса
cat /proc/1234/cmdline

# Узнать, сколько памяти использует процесс
grep VmRSS /proc/1234/status

# Список открытых файлов
ls -la /proc/1234/fd/

2. Информация о системе

/proc/cpuinfo         # Информация о процессорах
/proc/meminfo         # Информация о памяти
/proc/stat            # Статистика процессора и ввода-вывода
/proc/uptime          # Время работы системы
/proc/version         # Версия ядра
/proc/loadavg         # Средняя нагрузка на систему
/proc/sys/            # Параметры ядра (можно менять)

Практические примеры:

# Сколько памяти свободно
grep MemFree /proc/meminfo

# Характеристики процессоров
cat /proc/cpuinfo | grep processor | wc -l  # Количество ядер

# Время работы системы
cat /proc/uptime

Использование в C/C++ backend

1. Мониторинг процесса

#include <fstream>
#include <string>

long getMemoryUsage(int pid) {
    std::ifstream status("/proc/" + std::to_string(pid) + "/status");
    std::string line;
    while (std::getline(status, line)) {
        if (line.find("VmRSS") == 0) {
            return std::stol(line.substr(6));  // В KB
        }
    }
    return 0;
}

2. Получение информации о CPU

#include <fstream>

int getNumCores() {
    int cores = 0;
    std::ifstream cpuinfo("/proc/cpuinfo");
    std::string line;
    while (std::getline(cpuinfo, line)) {
        if (line.find("processor") == 0) {
            cores++;
        }
    }
    return cores;
}

3. Системные вызовы vs /proc

// Способ 1: через sysconf (более portable)
long cpus = sysconf(_SC_NPROCESSORS_ONLN);

// Способ 2: через /proc
int cpus = 0;
std::ifstream cpuinfo("/proc/cpuinfo");
// ... подсчёт processor строк

Практические применения

1. Отладка утечек памяти

# Мониторинг памяти процесса в реальном времени
watch -n 1 'cat /proc/[pid]/status | grep Vm'

2. Анализ открытых файлов

# Какие файлы открыл процесс
lsof -p [pid]
# или
ls -la /proc/[pid]/fd/

3. Анализ производительности

# CPU статистика
cat /proc/stat

# IO статистика
cat /proc/diskstats

4. Анализ нагрузки

cat /proc/loadavg
# Output: 0.15 0.10 0.08 2/128 1234
# = 1-минутная, 5-минутная, 15-минутная нагрузка, текущие процессы, последний PID

Важные замечания

  1. /proc может быть огромным: На системе с тысячами процессов /proc содержит много директорий.

  2. Производительность: Чтение /proc имеет накладные расходы. Не читайте /proc в горячем цикле без необходимости.

  3. Зависимость от ОС: /proc специфична для Linux. На других Unix-like системах используются альтернативы (например, sysctl на BSD).

  4. Недокументированность: Некоторые поля в /proc не официально задокументированы и могут меняться между версиями ядра.

Альтернативы в C/C++

Для портируемого кода используйте стандартные функции:

#include <unistd.h>
#include <sys/sysinfo.h>

// Количество процессоров
long cores = sysconf(_SC_NPROCESSORS_ONLN);

// Размер страницы памяти
long pagesize = sysconf(_SC_PAGE_SIZE);

// Информация о системе
struct sysinfo info;
sysinfo(&info);
long totalMemory = info.totalram * info.mem_unit;

Вывод

/proc — это мощный инструмент для системного программирования на Linux. Она позволяет писать инструменты мониторинга, отладки и профилирования без системных вызовов. Backend-разработчики используют /proc для анализа производительности, отладки утечек памяти и построения систем мониторинга. Однако помните о производительности и портируемости при использовании /proc в production коде.

Что такое /proc в Linux? | PrepBro