WikiDer > Дескриптор файла
В Unix и связанные с компьютерные операционные системы, дескриптор файла (FD, менее часто Fildes) - абстрактный индикатор (ручка) используется для доступа к файл или другой ввод, вывод ресурс, например трубка или же сетевой разъем. Дескрипторы файлов являются частью POSIX интерфейс прикладного программирования. Дескриптор файла неотрицательный целое число, обычно представленные в C язык программирования как тип int (отрицательные значения зарезервированы для обозначения «нет значения» или состояния ошибки).
Каждый Unix процесс (кроме, возможно, демон) следует ожидать наличия трех стандартных файловых дескрипторов POSIX, соответствующих трем стандартные потоки:
Целочисленное значение | Имя | <unistd.h> символическая константа[1] | <stdio.h> файловый поток[2] |
---|---|---|---|
0 | Стандартный ввод | STDIN_FILENO | стандартный ввод |
1 | Стандартный вывод | STDOUT_FILENO | стандартный вывод |
2 | Стандартная ошибка | STDERR_FILENO | stderr |
Обзор

В традиционной реализации Unix файловые дескрипторы индексируются по каждому процессу. таблица дескрипторов файлов поддерживается ядром, которое, в свою очередь, индексирует общесистемную таблицу файлов, открытых всеми процессами, называемую таблица файлов. В этой таблице записаны Режим с которым был открыт файл (или другой ресурс): для чтения, записи, добавления и, возможно, других режимов. Он также индексирует третью таблицу, называемую таблица inode который описывает фактические базовые файлы.[3] Для выполнения ввода или вывода процесс передает файловый дескриптор ядру через системный вызов, и ядро будет обращаться к файлу от имени процесса. У процесса нет прямого доступа к файлам или таблицам индексных дескрипторов.
На Linux, набор файловых дескрипторов, открытых в процессе, доступен по пути / proc / PID / fd /
, где PID - это идентификатор процесса.
В Unix-подобный систем, файловые дескрипторы могут относиться к любым Тип файла Unix названный в файловой системе. Помимо обычных файлов, сюда входят каталоги, блокировать и символьные устройства (также называемые «специальные файлы»), Доменные сокеты Unix, и именованные каналы. Дескрипторы файлов могут также относиться к другим объектам, которые обычно не существуют в файловой системе, например анонимные трубы и сетевые розетки.
Структура данных FILE в Стандартная библиотека ввода-вывода C обычно включает файловый дескриптор низкого уровня для рассматриваемого объекта в Unix-подобных системах. Общая структура данных обеспечивает дополнительную абстракцию и вместо этого известна как файл ручка.
Операции с файловыми дескрипторами
Ниже перечислены типичные операции с файловыми дескрипторами на современных Unix-подобный системы. Большинство этих функций объявлено в <unistd.h>
заголовок, но некоторые из них находятся в <fcntl.h>
заголовок вместо этого.
Создание файловых дескрипторов
- открыто()
- creat ()[4]
- разъем()
- принимать()
- socketpair ()
- трубка()
- epoll_create () (Linux)
- signalfd () (Linux)
- eventfd () (Linux)
- timerfd_create () (Linux)
- memfd_create () (Linux)
- userfaultfd () (Linux)
- fanotify_init () (Linux)
- inotify_init () (Linux)
- клон () (с флагом CLONE_PIDFD, Linux)
- pidfd_open () (Linux)
- open_by_handle_at () (Linux)
Получение дескрипторов файлов
- dirfd ()
- fileno ()
Операции с одним файловым дескриптором
- читать(), записывать()
- readv (), writev ()
- pread (), pwrite ()
- recv (), Отправить()
- recvfrom (), Отправить()
- recvmsg (), sendmsg () (также используется для отправки файлов FD другим процессам через сокет домена Unix)
- recvmmsg (), sendmmsg ()
- lseek (), llseek ()
- fstat ()
- fstatvfs ()
- fchmod ()
- fchown ()
- ftruncate ()
- fsync ()
- fdatasync ()
- fdopendir ()
- fgetxattr (), fsetxattr () (Linux)
- flistxatrr (), fremovexattr () (Linux)
- statx (Linux)
- Setns (Linux)
- vmsplice () (Linux)
- pidfd_send_signal () (Linux)
- waitid () (с типом P_PIDFD ID, Linux)
- fdopen () (функция stdio: преобразует дескриптор файла в ФАЙЛ *)
- dprintf () (функция stdio: печать в дескриптор файла)
Операции с несколькими файловыми дескрипторами
- Выбрать(), pselect ()
- опрос(), ppoll ()
- epoll_wait (), epoll_pwait () (Linux использует один файловый дескриптор epoll для ожидания многих других файловых дескрипторов)
- epoll_ctl () (для Linux)
- kqueue () (для систем на базе BSD).
- послать файл()
- сращивание (), тройник () (для Linux)
- copy_file_range () (для Linux)
Операции с таблицей файловых дескрипторов
В fcntl () Функция используется для выполнения различных операций с файловым дескриптором в зависимости от переданного ей аргумента команды. Есть команды для получения и установки атрибутов, связанных с файловым дескриптором, включая F_GETFD, F_SETFD, F_GETFL и F_SETFL.
- Закрыть()
- closefrom () (Только BSD и Solaris; удаляет все файловые дескрипторы больше или равные указанному номеру)
- dup () (дублирует существующий дескриптор файла, гарантируя наименьшее количество доступного дескриптора файла)
- dup2 (), dup3 () (Закройте fd1, если необходимо, и сделайте файловый дескриптор fd1 указывающим на открытый файл fd2)
- fcntl (F_DUPFD)
Операции, изменяющие состояние процесса
- fchdir () (устанавливает текущий рабочий каталог процесса на основе дескриптора файла каталога)
- mmap() (отображает диапазоны файла в адресное пространство процесса)
Блокировка файлов
- стадо()
- fcntl () (F_GETLK, F_SETLK и F_SETLKW)
- lockf ()
Розетки
- соединять()
- связывать()
- Слушать()
- принимать() (создает новый файловый дескриптор для входящего соединения)
- getsockname ()
- getpeername ()
- getsockopt ()
- setsockopt ()
- неисправность() (отключает одну или обе половины полнодуплексного соединения)
Разное
- ioctl () (большой набор различных операций над одним файловым дескриптором, часто связанным с устройством)
Предстоящие операции
Ряд новых операций с файловыми дескрипторами был добавлен во многие современные Unix-подобные системы, а также в многочисленные библиотеки C, которые будут стандартизированы в будущей версии POSIX.[5] В в
суффикс означает, что функция принимает дополнительный первый аргумент, предоставляющий дескриптор файла, из которого относительные пути разрешены, формы без в
суффикс, таким образом, становится эквивалентным передаче дескриптора файла, соответствующего текущему рабочий каталог. Цель этих новых операций - защита от определенного класса ТОКТУ атаки.
- openat ()
- faccessat ()
- fchmodat ()
- fchownat ()
- fstatat ()
- futimesat ()
- linkat ()
- мкдират ()
- mknodat ()
- readlinkat ()
- переименовать ()
- символическая ссылка ()
- unlinkat ()
- mkfifoat ()
- fdopendir ()
Дескрипторы файлов как возможности
Файловые дескрипторы Unix во многом ведут себя как возможности. Их можно передавать между процессами через Доменные сокеты Unix с использованием sendmsg()
системный вызов. Обратите внимание, однако, что фактически передается ссылка на «описание открытого файла», имеющее изменяемое состояние (смещение файла, а также статус файла и флаги доступа). Это усложняет безопасное использование файловых дескрипторов в качестве возможностей, поскольку, когда программы совместно используют доступ к одному и тому же открытому описанию файла, они могут вмешиваться в его использование друг другом, изменяя его смещение или, например, является ли оно блокирующим или неблокирующим.[6][7] В операционных системах, специально разработанных как системы возможностей, очень редко есть изменяемое состояние, связанное с самой возможностью.
Таблица файловых дескрипторов процесса Unix является примером C-список.
Смотрите также
- фьюзер (Unix)
- lsof
- Блок управления файлами (FCB) - альтернативная схема в C / PM и ранних версиях DOS
Рекомендации
- ^ Открытая группа. "Базовые спецификации Open Group, выпуск 7, IEEE Std 1003.1-2008, издание 2016 г.". Получено 2017-09-21.
- ^ Открытая группа. "Базовые спецификации Open Group, выпуск 7, IEEE Std 1003.1-2008, издание 2016 г.".
. Получено 2017-09-21. CS1 maint: лишняя пунктуация (связь) - ^ а б Бах, Морис Дж. (1986). Дизайн операционной системы UNIX (8-е изд.). Prentice-Hall. стр.92–96. ISBN 9780132017992.
- ^ Открытая группа. "Базовые спецификации Open Group, выпуск 7, IEEE Std 1003.1-2008, издание 2018 г. - создано". Получено 2019-04-11.
- ^ Расширенный набор API, часть 2. Открытая группа. Октябрь 2006 г. ISBN 1931624674.
- ^ Бринкманн, Маркус (2009-02-04). «Строим мост: API библиотеки и файловые дескрипторы?». болтовня. Архивировано из оригинал в 2012-07-30. Получено 2017-09-21.
- ^ де Бойн Поллард, Джонатан (2007). «Не устанавливайте для общих файловых дескрипторов неблокирующий режим ввода-вывода». Получено 2017-09-21.