stringtranslate.com

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

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

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

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

Обзор

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

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

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

Структура данных FILE в стандартной библиотеке ввода-вывода C обычно включает дескриптор файла низкого уровня для рассматриваемого объекта в Unix-подобных системах. Общая структура данных обеспечивает дополнительную абстракцию и вместо этого называется дескриптором файла .

Операции с файловыми дескрипторами

Ниже перечислены типичные операции с файловыми дескрипторами в современных Unix-подобных системах. Большинство этих функций объявлены в <unistd.h>заголовке, но некоторые находятся в <fcntl.h>заголовке.

Создание файловых дескрипторов

Получение файловых дескрипторов

Операции с одним файловым дескриптором

Операции с несколькими файловыми дескрипторами

Операции с таблицей файловых дескрипторов

Функция fcntl() используется для выполнения различных операций над файловым дескриптором в зависимости от переданного ей аргумента команды. Существуют команды для получения и установки атрибутов, связанных с дескриптором файла, включая F_GETFD, F_SETFD, F_GETFL и F_SETFL .

Операции, изменяющие состояние процесса

Блокировка файлов

Розетки

Разнообразный

Предстоящие операции

Ряд новых операций над файловыми дескрипторами был добавлен во многие современные Unix-подобные системы, а также в многочисленные библиотеки C, которые будут стандартизированы в будущей версии POSIX . [7] Суффикс atозначает, что функция принимает дополнительный первый аргумент, предоставляющий дескриптор файла, из которого разрешаются относительные путиat , поэтому формы, в которых отсутствует суффикс, становятся эквивалентными передаче дескриптора файла, соответствующего текущему рабочему каталогу . Целью этих новых операций является защита от определенного класса атак TOCTOU .

Дескрипторы файлов как возможности

Дескрипторы файлов Unix во многом действуют как возможности . Их можно передавать между процессами через сокеты домена Unix с помощью sendmsg()системного вызова. Однако обратите внимание, что на самом деле передается ссылка на «описание открытого файла», имеющее изменяемое состояние (смещение файла, состояние файла и флаги доступа). Это усложняет безопасное использование файловых дескрипторов в качестве возможностей, поскольку, когда программы совместно используют доступ к одному и тому же открытому описанию файла, они могут мешать его использованию друг другом, например, изменяя его смещение или то, является ли оно блокирующим или неблокирующим. [8] [9] В операционных системах, которые специально разработаны как системы возможностей, очень редко существует какое-либо изменяемое состояние, связанное с самой возможностью.

Таблица дескрипторов файлов процесса Unix является примером C-списка .

Смотрите также

Рекомендации

  1. ^ Открытая группа . «Базовые спецификации открытой группы, выпуск 7, IEEE Std 1003.1-2008, издание 2016 г.» . Проверено 21 сентября 2017 г.
  2. ^ Открытая группа. «Базовые спецификации открытой группы, выпуск 7, IEEE Std 1003.1-2008, издание 2016 г.». <stdio.h> . Проверено 21 сентября 2017 г.
  3. ^ аб Бах, Морис Дж. (1986). Проектирование операционной системы UNIX (8-е изд.). Прентис-Холл . стр. 92–96. ISBN 9780132017992.
  4. ^ «Устройства — что означает вывод 'll /Proc/Self/Fd/' (из 'll /Dev/Fd')?».
  5. ^ Открытая группа . «Базовые спецификации открытой группы, выпуск 7, IEEE Std 1003.1-2008, издание 2018 г. – создано» . Проверено 11 апреля 2019 г.
  6. ^ Стивен Китт, Майкл Керриск. «close_range(2) — страница руководства Linux» . Проверено 22 марта 2021 г.
  7. ^ Расширенный набор API, часть 2 . Открытая группа. Октябрь 2006 г. ISBN. 1931624674.
  8. ^ Бринкманн, Маркус (4 февраля 2009 г.). «Строим мост: библиотечные API и файловые дескрипторы?». кепка-разговор . Архивировано из оригинала 30 июля 2012 г. Проверено 21 сентября 2017 г.
  9. ^ де Бойн Поллард, Джонатан (2007). «Не переводите дескрипторы общих файлов в неблокирующий режим ввода-вывода» . Проверено 21 сентября 2017 г.