stringtranslate.com

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

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

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

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

Обзор

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

В традиционной реализации Unix файловые дескрипторы индексируются по каждому процессуТаблица дескрипторов файлов, поддерживаемая ядром, которая в свою очередь индексирует общесистемную таблицу файлов, открытых всеми процессами, называемуюfile table . Эта таблица записываетрежим, в котором был открыт файл (или другой ресурс): для чтения, записи, добавления и, возможно, других режимов. Она также индексируется в третьей таблице, называемойтаблицей инодов, которая описывает фактические базовые файлы.[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] В операционных системах, которые специально разработаны как системы возможностей, очень редко существует какое-либо изменяемое состояние, связанное с самой возможностью.

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

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

Ссылки

  1. ^ The Open Group . "The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008, издание 2016 г." . Получено 21 сентября 2017 г.
  2. ^ The Open Group. "The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008, издание 2016 г.". <stdio.h> . Получено 21.09.2017 .
  3. ^ ab Bach, Maurice J. (1986). Проектирование операционной системы UNIX (8-е изд.). Prentice-Hall . стр. 92–96. ISBN 9780132017992.
  4. ^ «Устройства — Что означает вывод 'll /Proc/Self/Fd/' (из 'll /Dev/Fd')?».
  5. ^ The Open Group . "The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008, издание 2018 г. – создано" . Получено 11 апреля 2019 г.
  6. ^ Стивен Китт, Майкл Керриск. "close_range(2) — Страница руководства Linux" . Получено 22.03.2021 .
  7. ^ Расширенный набор API, часть 2. The Open Group. Октябрь 2006. ISBN 1931624674.
  8. ^ Бринкманн, Маркус (2009-02-04). "Строительство моста: библиотечные API и файловые дескрипторы?". cap-talk . Архивировано из оригинала 2012-07-30 . Получено 2017-09-21 .
  9. ^ de Boyne Pollard, Jonathan (2007). "Не устанавливайте общие файловые дескрипторы в неблокируемый режим ввода-вывода" . Получено 21 сентября 2017 г.