В компьютерном программировании дескриптор — это абстрактная ссылка на ресурс , которая используется, когда прикладное программное обеспечение ссылается на блоки памяти или объекты, которые управляются другой системой, например базой данных или операционной системой .
Дескриптор ресурса может быть непрозрачным идентификатором , в этом случае он часто является целым числом (часто индексом массива в массиве или «таблице», которая используется для управления этим типом ресурса), или это может быть указатель , который позволяет получить доступ к дополнительной информации. Обычные дескрипторы ресурсов включают файловые дескрипторы , сетевые сокеты , соединения с базами данных , идентификаторы процессов (PID) и идентификаторы заданий . PID и идентификаторы заданий являются явно видимыми целыми числами; в то время как файловые дескрипторы и сокеты (которые часто реализуются как форма файлового дескриптора) представлены как целые числа, они обычно считаются непрозрачными. В традиционных реализациях файловые дескрипторы являются индексами в (для каждого процесса) таблице файловых дескрипторов , а следовательно, и в (системной) таблице файлов .
В то время как указатель содержит адрес элемента, на который он ссылается, дескриптор является абстракцией ссылки, которая управляется извне; его непрозрачность позволяет системе перемещать референт в памяти без аннулирования дескриптора, что делает его похожим на виртуальную память для указателей, но еще более абстрактным. Аналогично, дополнительный уровень косвенности также увеличивает контроль, который управляющая система имеет над операциями, выполняемыми над референтом. Обычно дескриптор является индексом или указателем на глобальный массив надгробий .
Утечка дескриптора — это тип программной ошибки , которая происходит, когда компьютерная программа не освобождает дескриптор, который она ранее выделила. Это форма утечки ресурсов , аналогичная утечке памяти для ранее выделенной памяти.
В терминах безопасных вычислений , поскольку доступ к ресурсу через дескриптор осуществляется через другую систему, дескриптор функционирует как возможность : он не только идентифицирует объект, но и связывает права доступа . Например, в то время как имя файла можно подделать (это всего лишь угадываемый идентификатор), дескриптор предоставляется пользователю внешней системой и, таким образом, представляет собой не только идентификацию, но и предоставленный доступ.
Например, если программа хочет прочитать файл системных паролей ( /etc/passwd
) в режиме чтения/записи ( O_RDWR
), она может попытаться открыть файл с помощью следующего вызова:
int fd = open ( "/etc/passwd" , O_RDWR );
Этот вызов просит операционную систему открыть указанный файл с указанными правами доступа. Если ОС это позволяет, то она открывает файл (создает запись в таблице дескрипторов файлов per-process ) и возвращает дескриптор (дескриптор файла, индекс в этой таблице) пользователю: фактический доступ контролируется ОС, а дескриптор является его токеном . И наоборот, ОС может отказать в доступе и, таким образом, не открыть файл и не вернуть дескриптор.
В системе, основанной на возможностях, дескрипторы могут передаваться между процессами с соответствующими правами доступа. Обратите внимание, что в этих случаях дескриптор должен быть чем-то иным, чем уникальное для всей системы небольшое целое число, в противном случае его можно подделать. Такое целое число, тем не менее, может использоваться для идентификации возможности внутри процесса; например, дескриптор файла в Linux не поддается подделке, поскольку его численное значение само по себе бессмысленно, и только в контексте процесса может ссылаться на что угодно. Однако передача такого дескриптора требует особой осторожности, поскольку его значение часто должно отличаться в процессах отправки и получения.
С другой стороны, в системах, не основанных на возможностях, каждый процесс должен получить свой собственный отдельный дескриптор, указав идентификатор ресурса и желаемые права доступа (например, каждый процесс должен открыть файл сам, указав имя файла и режим доступа). Такое использование более распространено даже в современных системах, которые поддерживают передачу дескрипторов, но оно подвержено уязвимостям, таким как проблема спутанного заместителя .
Дескрипторы были популярным решением для управления памятью в операционных системах 1990-х годов, таких как Mac OS [1] и Windows . Структура данных FILE в стандартной библиотеке ввода-вывода C представляет собой дескриптор файла , абстрагируясь от базового представления файла (в Unix это дескрипторы файлов ). Как и другие среды рабочего стола , API Windows активно использует дескрипторы для представления объектов в системе и предоставления пути связи между операционной системой и пространством пользователя . Например, окно на рабочем столе представлено дескриптором типа HWND
(дескриптор, окно).
Двойные косвенные дескрипторы (где дескриптор не обязательно является указателем, но может быть, например, целым числом) в последнее время вышли из моды, поскольку увеличение доступной памяти и улучшенные алгоритмы виртуальной памяти сделали использование более простого указателя более привлекательным. Однако многие операционные системы по-прежнему применяют этот термин к указателям на непрозрачные, «частные» структуры данных — непрозрачные указатели — или к индексам во внутренних массивах, передаваемых от одного процесса его клиенту .