Я хочу знать разницу между файловым дескриптором и файловым указателем.
Кроме того, в каком сценарии вы бы использовали одно вместо другого?
c
file-descriptor
file-pointer
karthi_ms
источник
источник
Ответы:
Дескриптор файла - это низкоуровневый целочисленный «дескриптор», используемый для идентификации открытого файла (или сокета, или чего-то еще) на уровне ядра в Linux и других Unix-подобных системах.
Вы передаете "голые" файловые дескрипторы в фактические вызовы Unix, например
read()
,write()
и так далее.FILE
Указатель представляет собой стандартную библиотеку уровня конструкт C, используемый для представления файла.FILE
Обертывания дескриптор файла, и добавляет буферизацию и другие функции , чтобы сделать / O проще я.Вы передаете
FILE
указатели на стандартные функции C, такие какfread()
иfwrite()
.источник
fd
это первый аргументread()
. Почему вы называете это голым?FILE *
типом стандартной библиотеки , целочисленный файловый дескриптор "менее обернут", то есть "голый".Один буферизован (
FILE *
), а другой нет. На практике вы хотите использоватьFILE *
почти всегда, когда читаете из «реального» файла (то есть на диске), если вы не знаете, что делаете, или если ваш файл на самом деле не является сокетом или около того ..Вы можете получить дескриптор файла из
FILE *
использования,fileno()
и вы можете открыть буферизованныйFILE *
из дескриптора файла, используяfdopen()
источник
Дескриптор файла - это просто целое число, которое вы получаете в результате
open()
вызова POSIX . Используя стандартный C,fopen()
вы получаетеFILE
структуру обратно. СтруктураFILE
содержит этот файловый дескриптор, среди прочего, например, индикатор конца файла и ошибки, позицию потока и т. Д.Таким образом, использование
fopen()
дает вам определенную абстракцию по сравнению сopen()
. В общем, вам следует использовать,fopen()
поскольку это более переносимо, и вы можете использовать все другие стандартные функции C, которые используютFILE
структуру, т. Е.fprintf()
И семейство.Нет никаких проблем с производительностью при использовании.
источник
Дескриптор файла против указателя файла
Дескриптор файла:
Дескриптор файла - это целое число, возвращаемое
open()
системным вызовом.int fd = open (filePath, mode);
Указатель файла:
Указатель файла - это указатель на структуру C, возвращаемую
fopen()
библиотечной функцией, которая используется для идентификации файла, упаковки дескриптора файла, функций буферизации и всех других функций, необходимых для операции ввода-вывода . Указатель файла имеет тип FILE , определение которого можно найти в "/usr/include/stdio.h" . Это определение может варьироваться от одного компилятора к другому.источник
Хотите добавить точки, которые могут быть полезны.
ОКОЛО
FILE *
Я много раз использую его для журналов отладки. пример,
ОКОЛО
FILE DESCRIPTOR
Обычно он используется для IPC.
Предоставляет низкоуровневый контроль над файлами в системах * nix (устройства, файлы, сокеты и т. Д.), Следовательно, более мощный, чем
FILE *
.источник
fdopen()
такие вещи, как IPC и устройстваFILE*
?FILE*
, но вы можете создатьFILE*
из файлового дескриптора (fdopen()
), а затемFILE
закрыть дескриптор. Таким образом, вы можете сделать IPC, но вам приходится иметь дело с дескрипторами файлов немного , чтобы облегчить любой прямой IPC.FILE *
является более полезным при работе с текстовыми файлами и пользовательским вводом / выводом, поскольку он позволяет использовать функции API , какsprintf()
,sscanf()
,fgets()
, иfeof()
т.д.API файловых дескрипторов является низкоуровневым, поэтому он позволяет работать с сокетами, каналами, отображенными в память файлами (и, конечно, с обычными файлами).
источник
Просто заметка, чтобы завершить обсуждение (если интересно) ....
fopen
может быть небезопасным, и вам, вероятно, следует использоватьfopen_s
илиopen
с установленными эксклюзивными битами. C1X предлагаетx
режимы, так что вы можетеfopen
с режимами"rx"
,"wx"
и т.д.Если вы используете
open
, вы можете рассмотретьopen(..., O_EXCL | O_RDONLY,... )
илиopen(..., O_CREAT | O_EXCL | O_WRONLY,... )
.См., Например, « Не делайте предположений относительно fopen () и создания файлов» .
источник
fopen_s
, кажется, недоступенPOSIX
, я предполагаю, что наиболее переносимым вариантом будет toopen(2)
and thenfdopen(2)
. (оставляя окна в стороне). Кроме того, что будет быстрееfopen_s()
илиopen(2)
за чем последуетfdopen(2)
?Системные вызовы в основном используют файловый дескриптор, например
read
иwrite
. Библиотечная функция будет использовать указатели файлов (printf
,scanf
). Но библиотечные функции используют только внутренние системные вызовы.источник
Я нашел хороший ресурс здесь , что дает подробный обзор различий между ними:
источник