Файловые и индексные дескрипторы в Linux

Oct, 20, 2025

🧩 Файловый дескриптор (File Descriptor)

Определение:
Файловый дескриптор — это абстрактный целочисленный идентификатор, который ядро Linux использует для представления открытого файла или потока ввода-вывода в контексте конкретного процесса.

Академически:
Файловый дескриптор (FD) — это индекс в таблице открытых файлов процесса (per-process file descriptor table). Каждая запись этой таблицы указывает на структуру ядра struct file, описывающую состояние открытого файла: позицию указателя чтения/записи, флаги доступа, права и т.д.

Ключевые свойства:

  • Дескриптор локален для процесса, но может быть унаследован дочерним процессом (fork()).
  • Стандартные номера:
    • 0 — стандартный ввод (stdin)
    • 1 — стандартный вывод (stdout)
    • 2 — стандартная ошибка (stderr)
  • Основные системные вызовы: open(), close(), read(), write(), dup(), fcntl(), poll(), select().

Пример:

int fd = open("/etc/passwd", O_RDONLY);
read(fd, buf, 128);
close(fd);

Здесь fd — файловый дескриптор, связанный с файлом /etc/passwd.


🧮 Индексный дескриптор (Index Descriptor, Inode)

Определение:
Индексный дескриптор (или inode) — это структура данных в файловой системе, содержащая метаданные файла, но не его имя или путь.

Академически:
inode — это запись в таблице inode-файловой системы, хранящая структурированную информацию о файле: тип, права доступа, владельцев, временные метки, количество ссылок и указатели на блоки данных.

Типичная структура inode включает:

  • st_mode — тип файла и права доступа
  • st_uid, st_gid — идентификаторы владельца и группы
  • st_size — размер файла
  • st_atime, st_mtime, st_ctime — временные метки доступа, изменения и метаданных
  • block pointers — ссылки на физические блоки данных на диске

Важно: имя файла хранится в каталоге, который связывает символьное имя с inode number. Таким образом, inode — это объект, а имя — ссылка на него.


🔗 Взаимосвязь между ними

УровеньОбъект ядраОписание
1Файловая системаСодержит таблицу inode, хранящую метаданные файлов.
2Inode (индексный дескриптор)Идентифицирует файл независимо от его имени.
3File object (struct file)Представляет состояние открытого файла (позицию, флаги и т.п.).
4File descriptor (int)Числовой идентификатор, ссылающийся на struct file в контексте процесса.

📚 Пример связи на практике

$ ls -li test.txt
123456 -rw-r--r-- 1 user user 42 Oct 20 22:00 test.txt
  • 123456 — номер inode (индексный дескриптор);
  • при open("test.txt") ядро создаст структуру struct file и выдаст процессу файловый дескриптор (например, fd = 3).

⚙️ Связанные системные вызовы

КатегорияСистемный вызовНазначение
Работа с файловыми дескрипторамиopen(), read(), write(), close()Управление открытыми файлами
Управление атрибутами inodestat(), fstat(), chmod(), chown()Чтение/изменение метаданных
Управление ссылкамиlink(), unlink()Создание и удаление имен для inode

📖 man inode (man7.org)
📖 man open (man7.org)

Файловые и индексные дескрипторы в Linux | Aleksandr Suprun