Введение
Идентификатор системного ресурса в операционных системах
В операционных системах Unix и Unix-подобных системах файловый дескриптор (FD, реже fildes) — это уникальный идентификатор (дескриптор) процесса для файла или другого ресурса ввода-вывода, такого как канал или сетевая сокет. Файловые дескрипторы обычно имеют неотрицательные целочисленные значения, при этом отрицательные значения зарезервированы для обозначения "нет значения" или ситуаций ошибки. Файловые дескрипторы являются частью API POSIX. Каждый процесс Unix (за исключением, возможно, демонов) должен иметь три стандартных файловых дескриптора POSIX, соответствующих трем стандартным потокам:
In Unix and Unix like computer operating systems, a file descriptor (FD, less frequently fildes) is a process unique identifier (handle) for a file or other input/output resource, such as a pipe or network socket. File descriptors typically have non negative integer values, with negative values being reserved to indicate "no value" or error conditions. File descriptors are a part of the POSIX API. Each Unix process (except perhaps daemons) should have three standard POSIX file descriptors, corresponding to the three standard streams:
Целочисленное значение Имя Символическая константа Поток ввода-вывода
0 Стандартный ввод
1 Стандартный вывод
2 Стандартная ошибка
Обзор
В традиционной реализации Unix, файловые дескрипторы индексируются в таблицу файловых дескрипторов, поддерживаемую ядром, которая, в свою очередь, индексируется в общесистемную таблицу открытых файлов, называемую таблицей файлов. Эта таблица содержит информацию о режиме, в котором файл (или другой ресурс) был открыт: для чтения, записи, добавления и, возможно, других режимов. Она также индексируется в третью таблицу, называемую таблицей inode, которая описывает фактические лежащие в основе файлы. Для выполнения операций ввода-вывода процесс передает файловый дескриптор ядру через системный вызов, и ядро получает доступ к файлу от имени процесса. Процесс не имеет прямого доступа к таблицам файлов или 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. В Unix-подобных системах файловые дескрипторы могут ссылаться на любой тип файла Unix, именованный в файловой системе. Помимо обычных файлов, это включает в себя каталоги, блочные и символьные устройства (также называемые «специальными файлами»), сокеты домена Unix и именованные каналы. Файловые дескрипторы также могут ссылаться на другие объекты, которые обычно не существуют в файловой системе, такие как анонимные каналы и сетевые сокеты. Структура данных FILE в стандартной библиотеке ввода-вывода C обычно включает в себя файловый дескриптор низкого уровня для соответствующего объекта в Unix-подобных системах. Эта структура данных обеспечивает дополнительную абстракцию и вместо этого называется дескриптором файла.
Операции с файловыми дескрипторами
Ниже приведен перечень типичных операций с файловыми дескрипторами в современных Unix-подобных системах. Большинство этих функций объявлены в заголовочном файле <unistd.h>, но некоторые – в <fcntl.h>.
Предстоящие операции
Серия новых операций с файловыми дескрипторами была добавлена во многие современные Unix-подобные системы и в многочисленные C-библиотеки для стандартизации в будущей версии POSIX. Суффикс "at" указывает на то, что функция принимает дополнительный первый аргумент, представляющий файловый дескриптор, относительно которого разрешаются пути, а формы без суффикса "at" становятся эквивалентными передаче файлового дескриптора, соответствующего текущей рабочей директории. Эти новые операции предназначены для защиты от определенного класса атак типа TOCTOU.
Описатели файлов как возможности
Описатели файлов Unix во многом ведут себя как возможности. Они могут передаваться между процессами через сокеты домена Unix с использованием системного вызова sendmsg. Однако следует отметить, что фактически передается ссылка на "открытое описание файла", которое имеет изменяемое состояние (смещение файла, статус файла и флаги доступа). Это затрудняет безопасное использование файловых дескрипторов в качестве возможностей, поскольку при совместном доступе программ к одному и тому же открытому описанию файла они могут мешать друг другу в его использовании, изменяя, например, смещение или режим блокировки. В операционных системах, специально разработанных как системы возможностей, изменяемое состояние, связанное с самой возможностью, встречается крайне редко. Таблица файловых дескрипторов процесса Unix является примером списка, реализованного на языке C.