← Back to notes

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


Файловый дескриптор (file descriptor)

Целочисленный индекс в таблице открытых файлов процесса (per-process file descriptor table). Каждая запись ссылается на запись в системной open file table (struct file), которая, в свою очередь, ссылается на inode.

Свойства:

  • Локален для процесса; наследуется через fork() (если не установлен FD_CLOEXEC).
  • Стандартные номера:
    • 0stdin
    • 1stdout
    • 2stderr
  • Системные вызовы: 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)

Уровни абстракции


Пример

$ 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 процессу.


Системные вызовы


Ссылки

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