Файловый дескриптор (file descriptor)
Целочисленный индекс в таблице открытых файлов процесса (per-process file descriptor table). Каждая запись ссылается на запись в системной open file table (struct file), которая, в свою очередь, ссылается на inode.
Свойства:
- Локален для процесса; при
fork()дочерний процесс всегда наследует копии всех fd (FD_CLOEXECзакрывает дескриптор приexecve(), а не приfork()). - Стандартные номера:
0—stdin1—stdout2—stderr
- Системные вызовы:
open(2),close(2),read(2),write(2),dup(2),dup2(2),fcntl(2),poll(2),select(2),epoll_create1(2),openat(2).
int fd = open("/etc/passwd", O_RDONLY);
read(fd, buf, 128);
close(fd);
Inode
Структура файловой системы, хранящая метаданные файла, но не имя. Имя — запись в каталоге, связывающая строку с номером inode.
Поля (см. struct stat, man inode(7)):
st_mode— тип файла и режим доступаst_uid,st_gid— владелец и группаst_size— размер в байтахst_atime,st_mtime,st_ctime— времена доступа, модификации содержимого, изменения метаданныхst_nlink— счётчик жёстких ссылокst_blocks,st_blksize— блочное представление- указатели на блоки данных (зависит от ФС: ext4, XFS, Btrfs)
Уровни абстракции
| Уровень | Объект | Описание |
|---|---|---|
| 1 | Файловая система | Содержит таблицу inode |
| 2 | inode | Идентифицирует файл независимо от имени |
| 3 | struct file (open file) | Состояние открытого файла: позиция, флаги |
| 4 | file descriptor (int) | Индекс per-process в таблице, ссылающийся на 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 процессу.
Системные вызовы
| Категория | Вызов | Назначение |
|---|---|---|
| FD | open(2), read(2), write(2), close(2) | Управление открытыми файлами |
| inode | stat(2), fstat(2), chmod(2), chown(2) | Метаданные |
| Ссылки | link(2), unlink(2), symlink(2) | Имена для inode |