В чем разница между файловым дескриптором и указателем на файл?
Я хочу знать разницу между дескриптором файла и указатель на файл.
кроме того, в каком сценарии вы бы использовали один вместо другого?
9 ответов:
дескриптор файла-это низкоуровневый целочисленный "дескриптор", используемый для идентификации открытого файла (или сокета, или чего-либо еще) на уровне ядра, в Linux и других Unix-подобных системах.
вы передаете "голые" файловые дескрипторы фактическим вызовам Unix, таким как
read()
,write()
и так далее.A
FILE
указатель-это стандартная конструкция уровня библиотеки C, используемая для представления файла. ЭлементFILE
обертывает файловый дескриптор и добавляет буферизацию и другие функции для ввода-вывода облегчающий.передать
FILE
указатели на стандартные функции C, такие какfread()
иfwrite()
.
один буферизуется (
FILE *
), а другой-нет. На практике вы хотите использоватьFILE *
почти всегда, когда вы читаете из "реального" файла (т. е. на диске), Если вы не знаете, что делаете, или если ваш файл на самом деле сокет или около того..вы можете получить дескриптор файла из
FILE *
используяfileno()
и вы можете открыть буферизованныйFILE *
из файлового дескриптора с помощьюfdopen()
файловый дескриптор - это просто целое число, которое вы получаете от Posix'
open()
звонок. Используя стандартный Cfopen()
вы получаетеFILE
структуры. ЭлементFILE
структура содержит этот файловый дескриптор среди других вещей, таких как конец файла и индикатор ошибок, положение потока и т. д.так что с помощью
fopen()
дает вам определенное количество абстракции по сравнению сopen()
. В общем, вы должны использоватьfopen()
так как это более портативный и вы можете использовать все другие стандартные C функции, которые используютFILE
struct, iefprintf()
и семьей.нет проблем с производительностью, используя либо или.
хотите добавить точки, которые могут быть полезны.
о
FILE *
- не может использоваться для межпроцессной связи (IPC).
- используйте его, когда вам нужна общая цель буферизованного ввода / вывода (printf,frpintf,snprintf,scanf)
я использовал его много раз для журналов отладки. например,
FILE *fp; fp = fopen("debug.txt","a"); fprintf(fp,"I have reached till this point"); fclose(fp);
о
FILE DESCRIPTOR
он обычно используется для IPC.
дает низкоуровневый контроль файлов в системах *nix.(устройства, файлы, сокеты и т. д.), Следовательно, более мощный, чем
FILE *
.
дескриптор файла против указателя файла
файл дескриптора:
дескриптор файла-это целочисленное значение, возвращаемое
open()
системный вызов.
int fd = open (filePath, mode);
- обработчик низкого уровня ядра.
- passe для чтения() и записи () системных вызовов UNIX.
- не включает буферизацию и такие особенности.
- менее портативный и не хватает эффективность.
файловый указатель:
указатель файла-это указатель на структуру C, возвращаемую
fopen()
библиотечная функция, которая используется для идентификация файла, обертывание дескриптора файла, функции буферизации и все другие функции, необходимые для операции ввода-вывода.Указатель на файл имеет тип FILE, определение которого можно найти в " /usr / include / stdio.h". Это определение может отличаться от одного компилятора к другому.FILE *fp = fopen (filePath, mode); // A FILE Structure returned by fopen typedef struct { unsigned char *_ptr; int _cnt; unsigned char *_base; unsigned char *_bufendp; short _flag; short _file; int __stdioid; char *__newbase; #ifdef _THREAD_SAFE void *_lock; #else long _unused[1]; #endif #ifdef __64BIT__ long _unused1[4]; #endif /* __64BIT__ */ } FILE;
- это интерфейс высокого уровня.
- передано в функции fread() и fwrite ().
- включает буферизацию, индикацию ошибки и обнаружение ЭОФ, ЕТК.
- обеспечивает более высокую переносимость и эффективность.
FILE *
более полезно при работе с текстовыми файлами и пользовательским вводом/выводом, потому что это позволяет использовать функции API, такие какsprintf()
,sscanf()
,fgets()
,feof()
etc.API дескриптора файла является низкоуровневым, поэтому он позволяет работать с сокетами, каналами, файлами с отображением памяти (и обычными файлами, конечно).
просто Примечание, чтобы закончить обсуждение (если интересно)....
fopen
может быть небезопасно, и вы, вероятно, должны использоватьfopen_s
илиopen
С набором эксклюзивных битов. C1X предлагаетx
режимами, так что вы можетеfopen
режимы"rx"
,"wx"
и т. д.если вы используете
open
, вы могли бы рассмотретьopen(..., O_EXCL | O_RDONLY,... )
илиopen(..., O_CREAT | O_EXCL | O_WRONLY,... )
.см., например, не делайте предположений о fopen () и создании файла.
системные вызовы в основном используют файловый дескриптор, например
read
иwrite
. Библиотечная функция будет использовать указатели на файлы (printf
,scanf
). Но библиотечные функции используют только внутренние системные вызовы.
в Unix и связанных с ним компьютерных операционных системах файловый дескриптор (FD, реже fildes) является абстрактным индикатором (дескриптором), используемым для доступа к файлу или другому ресурсу ввода/вывода, такому как канал или сетевой сокет. Файловые дескрипторы являются частью интерфейса прикладного программирования POSIX. Файловый дескриптор является неотрицательным целым числом, хотя обычно он представлен на языке программирования C как тип int, отрицательные значения зарезервированы для указания "нет значения" или ошибки состояние.