READAHEAD(2)

ИМЯ
readahead - включает упреждающее чтение файла в кэш страниц

ОБЗОР
#define _GNU_SOURCE             /* Смотрите feature_test_macros(7) */
#include <fcntl.h>

ssize_t readahead(int fd, off64_t offset, size_t count);

ОПИСАНИЕ
Вызов readahead() включает упреждающее чтение (initiates readahead) из файла таким образом, что последующие операции чтения этого файла будут брать данные их кэша и не блокировать дисковый ввод-вывод (предполагается, что упреждающее чтение началось раньше и что другие действия в системе не выбросили страницы из кэша).

Аргумент fd — это файловый дескриптор файла для чтения. В аргументе offset указывает начальная точка, от которой нужно читать данные и в count задаётся количество читаемых байт. Ввод-вывод выполняется во все страницы, так что offset эффективно округляется в меньшую сторону к границе страницы и байты читаются до границы следующей страницы, большей или равной (offset+count). Вызов readahead() не выполняет чтения за концом файла. Файловое смещение открытого файлового описания, на который указывает файловый дескриптор fd, остаётся неизменным.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении readahead() возвращает 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EBADF
    fd не является допустимым файловым дескриптором или не открыт на чтение.

EINVAL
    fd указывает на файл с типом, который нельзя использовать в readahead().

ВЕРСИИ
Системный вызов readahead() появился в Linux 2.4.13; поддержка в glibc началась с версии 2.3.

СООТВЕТСТВИЕ СТАНДАРТАМ
Системный вызов readahead() есть только в Linux, и не должен использоваться в переносимых приложениях.

ЗАМЕЧАНИЯ
На некоторых 32-битных архитектурах интерфейс системного вызова отличается от описанного выше, по причинам указанным в syscall(2).

ДЕФЕКТЫ
Вызов readahead() пытается запланировать чтение в фоновом режиме и сразу завершается. Однако, он может заблокироваться на время чтения метаданных файловой системы, необходимых для обнаружения запрашиваемых блоков. Это часто происходит ext[234] для больших файлов, у которых используются косвенные (indirect) блоки вместо непрерывных (extents), что приводит к блокировке вызова на время прочтения нужных данных.

СМОТРИТЕ ТАКЖЕ
lseek(2), madvise(2), mmap(2), posix_fadvise(2), read(2)