Я изучаю язык ассемблера вместе с C. В этой новой главе я начал говорить о «дескрипторах файлов», дескрипторах файлов для отображения на экране и дескрипторах файлов для ввода с клавиатуры и т. д. Я не знаю, что такое дескриптор файла? Я имею в виду IBM PC ASSEMBLY LANGUAGE PROGRAMMING Питера Абеля.
что такое дескриптор файла и где он пригодится программисту?
Ответы (3)
Существует общее понятие, обычно называемое «дескриптором» в контексте API-интерфейсов компьютерного программного обеспечения. В комментариях вы, вероятно, нашли ссылку на статью Википедии на эту тему.
Вы имеете дело с конкретной реализацией типа данных дескриптора — файловых дескрипторов IBM PC/DOS, возвращенных из интерфейса int 0x21
. Если вы хотите узнать больше об этих конкретных файловых дескрипторах, вы можете обратиться к книге Недокументированная DOS, в которой подробно описываются структуры данных в памяти, которые позволяют вам глубже исследовать эти дескрипторы.
Другим особым типом дескриптора является дескриптор файла, возвращаемый стандартным интерфейсом POSIX с именем open()
. Эта функция реализована в библиотеке времени выполнения C на таких платформах, как Linux, Windows NT, Mac OS и многих других системах. Целое число, возвращаемое вызовом open()
, не может быть отрицательным числом.
Если вы не работаете под DOS, ваши дескрипторы файлов, вероятно, предоставляются операционной системой Windows NT. Эти дескрипторы файлов возвращаются из CreateFile()
(который используется для открытия и создания файлов), и единственное недопустимое значение для дескриптора, возвращаемого этой функцией, — INVALID_HANDLE_VALUE
. То есть API Windows NT может возвращать то, что будет считаться (посредством приведения) «отрицательным» целым числом, хотя он открыл файл.
Во всех этих случаях дескриптор файла используется для ссылки на некоторую структуру данных, которая отслеживает, как файл открыт. Одна важная вещь, которая отслеживается, — это текущая позиция файла. Позиция или указатель устанавливается в POSIX функцией lseek()
и считывается функцией tell()
. Любые read()
или write()
имеют место с позиции текущего указателя файла.
Ваша программа может открывать один и тот же файл под двумя разными дескрипторами. В этом случае указатель файла для каждого дескриптора различен. Обновление указателя файла одного дескриптора с помощью lseek()
не повлияет на указатель файла другого дескриптора на тот же файл.
Дескриптор файла — это целочисленное значение, которое используется для адресации открытого файла. Такие дескрипторы сильно зависят от операционной системы, но в системах, поддерживающих вызов open(), вы создаете такой дескриптор:
int handle = open( "foo.txt", OTHER_STUFF_HERE );
Затем вы можете использовать дескриптор с вызовами чтения/записи. Непереносимость дескрипторов означает, что большинство людей избегают их и вместо этого используют функции потоковой библиотеки в C, такие как fopen, fread, fwrite и т. д.
open()
работает так же хорошо под Windows NT (без cygwin), как и под Linux.
- person Heath Hunnicutt; 25.05.2011
Дескриптор — это то, что ядро использует внутри себя для доступа к какому-либо ресурсу. Только ядро на самом деле знает, что это значит, пользовательскому процессу только говорят, какое значение использовать, когда он хочет получить доступ к этому ресурсу. У них есть еще одно преимущество в том, что дескрипторы файлов могут совместно использоваться процессами, в то время как вы не можете сделать это с помощью указателей.
Windows использует дескрипторы повсюду... файлы, растровые изображения, контексты устройств, шрифты и т. д.