readahead - включает упреждающее чтение файла в кэш страниц
readahead(2)
включает упреждающее чтение файла в кэш страниц
ОБЗОР
#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), что приводит к
блокировке вызова на время прочтения нужных данных.