Что такое открытие файла в C? - PullRequest
6 голосов
/ 27 декабря 2010

В C, когда мы открываем файл, что происходит ?? Поскольку я знаю, что содержимое файла не загружается в память, когда мы открываем файл. Это просто устанавливает дескриптор файла? Так что же это за файловый дескриптор? А если содержимое файла не загружено в память, то как файл открывается?

Ответы [ 7 ]

6 голосов
/ 27 декабря 2010

Как правило, если вы открываете файл с помощью fopen или (в системе POSIX) open, в случае успеха функция «откроет файл» - она ​​просто выдаст вам значение (* 1003)* или int) для использования в будущих вызовах функции чтения.

В операционной системе может прочитать часть или весь файл, а может и нет.Вы должны вызвать некоторую функцию, чтобы запросить данные для чтения в любом случае, и если она не сделала этого к тому времени, когда вы вызываете fread / fgets / read / etc ..., тогда это произойдет в этот момент.

«Дескриптор файла» обычно относится к целому числу, возвращаемому open в системах POSIX.Он используется для идентификации открытого файла.Если вы получаете значение 3, то где-то операционная система отслеживает, что 3 относится к /home/user/dir/file.txt, или что-то еще.Это короткое небольшое значение, указывающее операционной системе , из какого файла читать.Когда вы звоните open и открываете, скажем, foo.txt, операционная система говорит: «Хорошо, файл открыт, с этого момента вызывается 3».

4 голосов
/ 27 декабря 2010

Этот вопрос не полностью связан с языком программирования.Хотя библиотека влияет на то, что происходит при открытии файла (например, с использованием open или fopen), основное поведение исходит от операционной системы.

Linux, и я предполагаю, что другие ОСвыполнять чтение вперед в большинстве случаев.Это означает, что файл фактически читается из физического хранилища еще до того, как вы вызовете файл read.Это сделано для оптимизации, сокращая время чтения, когда файл фактически читается пользователем.Это поведение может частично контролироваться программистом, используя специальный флаг для открытых функций.Например, Win32 API CreateFile может указывать FILE_FLAG_RANDOM_ACCESS или FILE_FLAG_SEQUENTIAL_SCAN для указания произвольного доступа (в этом случае файл не читается впереди) или последовательного доступа (в этом случае ОС будет выполнять довольно агрессивное чтение впереди),соответственно.Другие API-интерфейсы ОС могут предоставлять более или менее контроль.

Для базового API-интерфейса ANSI C open, read, write, в котором используется дескриптор файла, дескриптор файла представляет собой простое целое число, которое передаетсяна ОС и означает файл.В самой ОС это чаще всего переводится в некую структуру, которая содержит всю необходимую информацию для файла (имя, путь, смещения поиска, размер, буферы чтения и записи и т. Д.).ОС откроет файл - то есть найдет конкретную запись файловой системы (inode в Linux), которая соответствует пути, указанному вами в методе open, создаст структуру файла и вернет идентификатор пользователю -дескриптор файла.С этого момента ОС может свободно читать любые данные, которые кажутся подходящими, даже если пользователь не запрашивает их (часто выполняется чтение больше, чем было запрошено, по крайней мере, для работы в собственном размере файловой системы).

2 голосов
/ 27 декабря 2010

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

1 голос
/ 27 декабря 2010

Если программа использует fopen(), тогда пакет буферизации будет использовать системный вызов для конкретной реализации *1003*, чтобы получить дескриптор файла, и будет хранить его в структуре FILE.* Системный вызов (по крайней мере, в Unix, Linux и Mac) будет искать (обычно) файловую систему на диске, чтобы найти файл.Он создает структуры данных в памяти ядра, которые собирают информацию, необходимую для чтения или записи файла.

Он также создает таблицу для каждого процесса, которая ссылается на другие структуры данных ядра, необходимые для доступа к файлу.Индекс в этой таблице (обычно) небольшое число.Это дескриптор файла, который возвращается из системного вызова пользовательскому процессу и затем сохраняется в структуре FILE.

1 голос
/ 27 декабря 2010

Файловые дескрипторы - это просто аннотации.Все сделано в операционной системе.

0 голосов
/ 27 декабря 2010

Когда вы открываете файл, тогда указатель файла получает базовый адрес (начальный адрес) этого файла. Затем вы используете различные функции для работы с файлом. РЕДАКТИРОВАТЬ: Благодаря Крису, вот структура, которая называется FILE

typedef struct  {
       int             level;      /* fill/empty level of buffer */
       unsigned        flags;      /* File status flags          */
       char            fd;         /* File descriptor            */
       unsigned char   hold;       /* Ungetc char if no buffer   */
       int             bsize;      /* Buffer size                */
       unsigned char   *buffer;    /* Data transfer buffer       */
       unsigned char   *curp;      /* Current active pointer     */
       unsigned        istemp;     /* Temporary file indicator   */
       short           token;      /* Used for validity checking */
}      FILE;   
0 голосов
/ 27 декабря 2010

Как уже упоминалось, это функциональность ОС.

Но для ввода / вывода из файла C скорее всего вам нужна информация о функции fopen.

Если вы проверите описание для этой функции, оно говорит:

Описание:

Открывает поток.

fopen открывает файл с именем имя файла и связывает поток с Это. fopen возвращает указатель для использования идентифицировать поток в последующем операции.

Таким образом, при успешном завершении fopen просто возвращает указатель на вновь открытый поток. И он возвращает NULL в случае любой ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...