что такое дескриптор файла и где он полезен для программиста? - PullRequest
10 голосов
/ 24 мая 2011

Я изучаю ассемблер вместе с C. В этой новой главе я начал рассказывать о «дескрипторах файлов», дескрипторах файлов для отображения на экране и дескрипторах файлов для ввода с клавиатуры и т. Д. Я не знаю, что такое дескриптор файла? Я имею в виду программирование на языке IBM PC ASSEMBLY Питера Абеля

Ответы [ 3 ]

8 голосов
/ 24 мая 2011

Существует общая концепция, обычно называемая «дескриптором» в контексте программных интерфейсов программного обеспечения.В комментариях вы, вероятно, нашли ссылку на статью Википедии на эту тему .

Вы имеете дело с конкретной реализацией типа данных дескриптора - дескрипторов файлов IBM PC / DOSвозвращается из интерфейса int 0x21.Если вы хотите узнать больше об этих конкретных файловых дескрипторах, вы можете обратиться к книге Недокументированная DOS , в которой подробно описываются структуры данных в памяти, которые позволяют вам исследовать эти дескрипторы дальше.1009 * Другим конкретным типом дескриптора является дескриптор файла , возвращаемый из стандартного интерфейса POSIX с именем open().Эта функция реализована в библиотеке времени выполнения C на таких платформах, как Linux, Windows NT, Mac OS и многих других системах.Целое число, возвращаемое при вызове open(), может не быть отрицательным числом.

Если вы не работаете в DOS, ваши файловые дескрипторы, вероятно, предоставляются операционной системой Windows NT.Эти файловые дескрипторы возвращаются из CreateFile() (который используется как для открытия, так и для создания файлов), и единственное недопустимое значение для дескриптора, возвращаемого из этой функции, - INVALID_HANDLE_VALUE.Т.е. API-интерфейс Windows NT может возвращать то, что считается (посредством приведения) «отрицательным» целым числом, хотя он открыл файл.

Во всех этих случаях дескриптор файла используется для ссылки на некоторыеструктура данных, которая отслеживает, как файл открыт.Отслеживается одна важная вещь: текущий файл position .Положение или указатель устанавливается в POSIX с помощью функции lseek() и считывается с помощью функции tell().Любой read() или write() происходит с позиции указателя текущего файла.

Ваша программа может открывать один и тот же файл под двумя разными дескрипторами.В этом случае указатель файла для каждого дескриптора различен.Обновление указателя файла одного дескриптора с помощью lseek() не повлияет на указатель файла другого дескриптора на тот же файл.

Undocumented DOS

8 голосов
/ 24 мая 2011

Дескриптор файла - это целочисленное значение, которое используется для обращения к открытому файлу.Такие дескрипторы сильно зависят от операционной системы, но в системах, которые поддерживают вызов open (), вы создаете дескриптор, подобный следующему:

int handle = open( "foo.txt", OTHER_STUFF_HERE );

Затем вы можете использовать дескриптор с вызовами чтения / записи.Непереносимость дескрипторов означает, что большинство людей избегают их и вместо этого используют функции потоковой библиотеки в C, такие как fopen, fread, fwrite и т. Д.

3 голосов
/ 24 мая 2011

Дескриптор - это то, что ядро ​​использует внутри для доступа к какому-либо ресурсу. Только ядро ​​действительно знает, что это значит, пользовательскому процессу сообщается только то, какое значение использовать, когда он хочет получить доступ к этому ресурсу. У них есть еще одно преимущество в том, что файловые дескрипторы могут совместно использоваться процессами, тогда как вы не можете сделать это с помощью указателей.

Windows использует дескрипторы повсюду ... файлы, растровые изображения, контексты устройств, шрифты и т. Д.

...