В 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 и именованные каналы . Дескрипторы файлов также могут ссылаться на другие объекты, которые обычно не существуют в файловой системе, такие как анонимные каналы и сетевые сокеты .