Этот вопрос не полностью связан с языком программирования.Хотя библиотека влияет на то, что происходит при открытии файла (например, с использованием 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
, создаст структуру файла и вернет идентификатор пользователю -дескриптор файла.С этого момента ОС может свободно читать любые данные, которые кажутся подходящими, даже если пользователь не запрашивает их (часто выполняется чтение больше, чем было запрошено, по крайней мере, для работы в собственном размере файловой системы).