2010-03-11 6 views

ответ

110

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

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

A FILE Указатель представляет собой стандартную библиотечную конструкцию C, предназначенную для представления файла. FILE обертывает файловый дескриптор и добавляет буферизацию и другие функции для облегчения ввода-вывода.

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

+0

@ nvl: fildes, безусловно, доступен для Windows, например. http://msdn.microsoft.com/en-us/library/z0kc8e3z%28VS.80%29.aspx – kennytm

+0

@kennyTM: спасибо за исправление :). –

+1

@unwind Что вы имели в виду под «обнаженными» файловыми дескрипторами? Связанная ссылка говорит, что 'fd' является первым аргументом' read() '. Почему ты называешь это голой? – Geek

12

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

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

Нет проблем с производительностью, используя либо или.

+4

+1 для обеспечения переносимости. FILE является частью стандартной библиотеки C (обратно к C89/C90); файловых дескрипторов нет. – tomlogic

1

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

+0

Я не уверен, почему вы говорите, что функции библиотеки используют только внутренние системные вызовы. Если вы имеете в виду стандартные функции CI/O (или любые другие функции), я не уверен, что это (универсально?) True , В противном случае, это не то, что вы сказали, поэтому я хотел бы, чтобы язык на вашем посту немного очистился. Последнее предложение меня озадачивает. –

1

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

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

+0

+1, потому что вы добавили файлы с отображением памяти, так как с моего текущего чтения другие ответы уже были поставлены. –

48

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

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

+9

+1 для указания на fileno(), организация страниц man затрудняет поиск. То же самое для fdopen(). –

8

Хочет добавить пункты, которые могут быть полезны.

О FILE *

  1. не может быть использован для межпроцессного взаимодействия (IPC).
  2. использовать его, когда вам нужен буферный ввод/вывод. (Printf, frpintf, snprintf, scanf)
  3. Я использую его много раз для отладочных журналов. пример,

       FILE *fp; 
          fp = fopen("debug.txt","a"); 
          fprintf(fp,"I have reached till this point"); 
          fclose(fp); 
    

О FILE DESCRIPTOR

  1. Это обычно используется для IPC.

  2. Дает управление уровнем низкого уровня для файлов на системах * nix (устройства, файлы, сокеты и т. Д.), Следовательно, более мощным, чем FILE *.

+0

Не можете ли вы использовать 'fdopen()', чтобы делать что-то вроде IPC и устройств с 'FILE *'? – Spookbuster

+0

Собственно, и да, и нет. Вы не можете настроить и инициализировать IPC с помощью 'FILE *', но вы можете создать 'FILE *' из дескриптора файла ('fdopen()'), а позже закрытие 'FILE' также закроет дескриптор. Таким образом, вы можете * сделать * IPC, но вам нужно иметь дело с файловыми дескрипторами немного, чтобы облегчить прямой IPC. –

2

Только примечание, чтобы закончить обсуждение (если интересно) ....

fopen может быть небезопасно, и вы, вероятно, следует использовать fopen_s или open с исключительными установленными битами. C1X предлагает x режимы, так что вы можете fopen с режимами "rx", "wx" и т.д.

Если вы используете open, вы могли бы рассмотреть open(..., O_EXCL | O_RDONLY,...) или open(..., O_CREAT | O_EXCL | O_WRONLY,...).

См., Например, Do not make assumptions about fopen() and file creation.

6

дескриптора файла против указателя файла

дескриптор файла:

File Descriptor представляет собой целое значение, возвращаемое open() системного вызова.

int fd = open (filePath, mode);

  1. Low/Kernel обработчик уровня.
  2. passe для чтения() и записи() системных вызовов UNIX.
  3. Не включает буферизацию и такие функции.
  4. Меньше портативных и не хватает эффективности.

указатель файла:

файла Указатель представляет собой указатель на структуру 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; 
  1. Это интерфейс высокого уровня.
  2. Выполнено для функций fread() и fwrite().
  3. Включает буферизацию, индикацию ошибок и обнаружение EOF и т. Д.
  4. Обеспечивает более высокую мобильность и эффективность.
+1

Можете ли вы создать резервную копию более высокой эффективности? Я этого никогда не слышал. – Gid

1

В Unix и связанных с ним компьютерных операционных системах дескриптор файла (FD, реже fildes) представляет собой абстрактный индикатор (дескриптор), используемый для доступа к файлу или другому ресурсу ввода/вывода, например, к каналу или сетевому сокету , Файловые дескрипторы являются частью интерфейса прикладного программирования POSIX. Дескриптор файла является неотрицательным целым числом, хотя он обычно представлен на языке программирования C как тип int, отрицательные значения зарезервированы для указания «нет значения» или условия ошибки.

Смежные вопросы