🧩 Файловый дескриптор (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, хранящую метаданные файлов. |
| 2 | Inode (индексный дескриптор) | Идентифицирует файл независимо от его имени. |
| 3 | File object (struct file) | Представляет состояние открытого файла (позицию, флаги и т.п.). |
| 4 | File 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() | Управление открытыми файлами |
| Управление атрибутами inode | stat(), fstat(), chmod(), chown() | Чтение/изменение метаданных |
| Управление ссылками | link(), unlink() | Создание и удаление имен для inode |