Дескриптор файла


В Unix и Unix-подобных компьютерных операционных системах файловый дескриптор ( FD , реже fildes ) — это уникальный идентификатор ( дескриптор ) файла или другого ресурса ввода/вывода , например канала или сетевого сокета .

Дескрипторы файлов обычно имеют неотрицательные целые значения, а отрицательные значения зарезервированы для обозначения «нет значения» или условий ошибки.

Дескрипторы файлов являются частью POSIX API . Каждый процесс Unix (за исключением, возможно, демонов ) должен иметь три стандартных файловых дескриптора POSIX, соответствующих трем стандартным потокам :

В традиционной реализации Unix файловые дескрипторы индексируются для каждого процесса.таблица файловых дескрипторов, поддерживаемая ядром, которая, в свою очередь, индексируется в общесистемную таблицу файлов, открытых всеми процессами, называемуюфайловая таблица . В этой таблице записываетсярежим, в котором был открыт файл (или другой ресурс): для чтения, записи, добавления и, возможно, другие режимы. Он также индексируется в третью таблицу, называемуютаблицей инодов, которая описывает фактические базовые файлы. [3] Для выполнения ввода или вывода процесс передает файловый дескриптор ядру черезсистемный вызов, и ядро ​​обращается к файлу от имени процесса. Процесс не имеет прямого доступа к файлам или таблицам inode.

В Linux к набору дескрипторов файлов, открытых в процессе, можно получить доступ по пути /proc/PID/fd/, где PID — идентификатор процесса . Дескриптор файла /proc/PID/fd/0есть stdin, /proc/PID/fd/1есть stdoutи /proc/PID/fd/2есть stderr. В качестве ярлыка для них любой запущенный процесс также может получить доступ к своим собственным файловым дескрипторам через папки /proc/self/fdи файлы /dev/fd. [4]

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


Файловые дескрипторы для одного процесса, файловая таблица и таблица inode . Обратите внимание, что несколько файловых дескрипторов могут ссылаться на одну и ту же запись таблицы файлов (например, в результате системного вызова dup [3] : 104  ) и что несколько записей таблицы файлов могут, в свою очередь, ссылаться на один и тот же индексный дескриптор (если он был открыт). несколько раз; таблица по-прежнему упрощена, поскольку в ней индексные дескрипторы представлены именами файлов, хотя индексный дескриптор может иметь несколько имен ). Дескриптор файла 3 не ссылается ни на что в таблице файлов, что означает, что он был закрыт.