Что такое файловый дескриптор

Vitalii Filiuchkov
2 min readJan 18, 2022

--

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

Например, когда вы открываете или создаете новый файл или сокет, что делает ядро: предоставляет доступ, создает запись в глобальной файловой таблице и отдает приложению местоположение этой записи. Операционная система формирует для себя запись для представления этого файла и хранения информации о нем. Запись в файловой таблице содержит такую информацию, как inode файла, смещение байта и ограничения доступа для этого потока данных (только для чтения, только для записи и т.д.). У каждого файла существует как минимум один индивидуальный файловый дескриптор Linux. Открыли 100 файлов — где-то в ядре появились 100 записей, представленных целыми числами.

Дескриптор для каждого процесса является уникальным. Но есть три жестко закрепленных индекса — это первые три номера (0, 1, 2).

  • 0 — стандартный ввод (stdin), место, из которого программа получает интерактивный ввод.
  • 1 — стандартный вывод (stdout), на который направлена большая часть вывода программы.
  • 2 — стандартный поток ошибок (stderror), в который направляются сообщения об ошибках.

Когда работа с файлом завершена, присвоенный ему дескриптор освобождается и возвращается в пул свободных номеров. Он снова доступен для выделения под новый файл.

В Unix-подобных системах файловые дескрипторы могут относиться к любому типу файлов Unix: обычным файлам, каталогам, блочным и символьным устройствам, сокетам домена, именованным каналам. Дескрипторы также могут относиться к объектам, которые не существуют в файловой системе: анонимным каналам и сетевым сокетам.

Понятием «файловый дескриптор» оперируют и в языках программирования. Например, в Python функция os.open(path, flags, mode=0o777, *, dir_fd=None) открывает путь к файлу path, добавляет флаги и режим, а также возвращает дескриптор для вновь открытого файла. Начиная с версии 3.4 файловые дескрипторы в дочернем процессе Python не наследуются. В Unix они закрываются в дочерних процессах при выполнении новой программы.

Для чего нужны файловые дескрипторы

Чтобы оценить важность файловых дескрипторов, нужно разобраться, как работает файловая система.

  1. В традиционной реализации Unix дескрипторы индексируются в таблицу дескрипторов для каждого процесса, поддерживаемого ядром.
  2. Таблица файловых дескрипторов индексирует общесистемную таблицу файлов, открытых всеми процессами.
  3. В таблице файлов записывается режим, в котором открыт файл или другой ресурс — например, для чтения, записи, чтения и записи.
  4. Режим индексируется в таблицу индексных дескрипторов, описывающих фактические базовые файлы. В каждом индексном дескрипторе хранятся атрибуты и расположение дисковых блоков переданного объекта.

Когда нужно выполнить ввод или вывод, процесс через системный вызов передает ядру дескриптор нужного файла. Ядро обращается к файлу от имени процесса. При этом у самого процесса нет доступа к файлу или таблице индексных дескрипторов.

--

--

Vitalii Filiuchkov

SRE Lead in Cloud Division of the largest telecom operator in Russia