Каково различие между указателем файла и дескриптором файла?

Я хочу знать различие между указателем файла и дескриптором файла.

Кроме того, в каком сценарии Вы использовали бы один вместо другого?

106
задан John Carter 19 November 2011 в 04:47
поделиться

5 ответов

Дескриптор файла - это низкоуровневый целочисленный «дескриптор», используемый для идентификации открытого файла (или сокета, или чего-то еще) на уровне ядра в Linux и других Unix-подобных системах.

Вы передаете «голые» файловые дескрипторы в фактические вызовы Unix, такие как read () , write () и так далее.

Указатель FILE - это стандартная конструкция уровня библиотеки C, используемая для представления файла. ФАЙЛ является оболочкой для дескриптора файла и добавляет буферизацию и другие функции, упрощающие ввод-вывод.

Вы передаете указатели FILE стандартным функциям C, таким как fread () и fwrite () .

136
ответ дан 24 November 2019 в 03:48
поделиться

Системные вызовы в основном используют дескриптор файла, например чтение и запись . Библиотечная функция будет использовать указатели файлов ( printf , scanf ). Но библиотечные функции используют только внутренние системные вызовы.

1
ответ дан 24 November 2019 в 03:48
поделиться

Дескриптор файла - это просто целое число, которое вы получаете от вызова Posix ' open () . Используя стандартную функцию C fopen () , вы получаете обратно структуру FILE . Структура FILE содержит дескриптор этого файла, среди прочего, например, индикатор конца файла и ошибки, позицию потока и т. Д.

Таким образом, использование fopen () дает вам определенную объем абстракции по сравнению с open () . В общем, вам следует использовать fopen () , поскольку он более переносимый, и вы можете использовать все другие стандартные функции C, которые используют структуру FILE , то есть fprintf () и семья.

При использовании или нет проблем с производительностью.

19
ответ дан 24 November 2019 в 03:48
поделиться

ФАЙЛ * более полезен при работе с текстовыми файлами и пользовательским вводом / выводом, поскольку он позволяет использовать такие функции API, как sprintf () , sscanf () , fgets () , feof () и т. Д.

API файлового дескриптора является низкоуровневым, поэтому он позволяет работать с сокетами, каналами, отображенными в память файлами (и обычные файлы, конечно).

3
ответ дан 24 November 2019 в 03:48
поделиться

Один буферизируется ( ФАЙЛ * ), а другой нет. На практике вы хотите использовать FILE * почти всегда, когда вы читаете из «реального» файла (т.е. на диске), если вы не знаете, что делаете, или если ваш файл на самом деле не является сокетом. или около того ..

Вы можете получить дескриптор файла из FILE * , используя fileno () , и вы можете открыть буферизованный FILE * из файла дескриптор с использованием fdopen ()

56
ответ дан 24 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: