что такое дескриптор файла и где он пригодится программисту?

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


person KawaiKx    schedule 24.05.2011    source источник
comment
en.wikipedia.org/wiki/Handle_%28computing%29   -  person Matt Ball    schedule 24.05.2011
comment
Эквивалентом Unix является файловый дескриптор. Это точно такая же концепция (целое число, которое вы можете передать ядру, где оно знает об уже открытом файле). en.wikipedia.org/wiki/File_descriptor   -  person Peter Cordes    schedule 18.10.2017


Ответы (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() не повлияет на указатель файла другого дескриптора на тот же файл.

Недокументированная DOS

person Heath Hunnicutt    schedule 24.05.2011

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

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

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

person Community    schedule 24.05.2011
comment
Большинство людей используют fopen()? Это просто неправда. - person Heath Hunnicutt; 24.05.2011
comment
@Heath Как вы думаете, большинство людей используют open()? Не по моему опыту. - person ; 24.05.2011
comment
Подожди, а есть люди, которые на самом деле используют open()??? :-) Да, хорошо, я один из них, но только для вещей, зависящих от ОС, которые вы просто не можете сделать с файлами fopen()d... - person Brian Knoblauch; 24.05.2011
comment
@ Брайан Я уверен, что люди используют open, я уверен, что Линус использует его все время :-) Я также уверен, что большинство людей этого не делают. - person ; 24.05.2011
comment
@Neil - это не система, которая поддерживает open (), это библиотека времени выполнения. open() работает так же хорошо под Windows NT (без cygwin), как и под Linux. - person Heath Hunnicutt; 25.05.2011

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

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

person James    schedule 24.05.2011