AIO_READ(3)

ИМЯ
aio_read - асинхронное чтение

ОБЗОР
#include <aio.h>

int aio_read(struct aiocb *aiocbp);

Компонуется при указании параметра -lrt.

ОПИСАНИЕ
Функция aio_read() ставит в очередь запрос ввода-вывода, описанный в буфере, на который указывает aiocbp. Эта функция является асинхронным аналогом вызова read(2). Аргументы функции

    read(fd, buf, count)

соответствуют (в указанном порядке) полям aio_fildes, aio_buf и aio_nbytes структуры, на которую указывает aiocbp (описание структуры aiocb смотрите в aio(7)).

Чтение данных выполняется начиная с абсолютного положения в файле aiocbp->aio_offset, независимо от смещения в файле. После вызова значение смещения в файле не определено.

Прилагательное «асинхронный» означает, что вызов возвращает управление сразу после установки запроса в очередь; при завершении вызова чтение может уже выполнится, а может и нет. Для проверки выполнения чтения используйте aio_error(3). Состояние возврата завершённой операции ввода-вывода можно получить с помощью aio_return(3). Асинхронное уведомление о выполнении ввода-вывода можно получить, установив aiocbp->aio_sigevent соответствующим образом; подробней смотрите в sigevent(7).

Если определён макрос _POSIX_PRIORITIZED_IO и данный файл его поддерживает, асинхронная операция устанавливается в очередь с приоритетом вызывающего процесса минус aiocbp->aio_reqprio.

Поле aiocbp->aio_lio_opcode игнорируется.

Данные не читаются из обычного файла, если смещение превышает максимум.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. При ошибке запрос не устанавливается в очередь, возвращается -1, errno присваивается соответствующее значение. Если ошибка обнаруживается не сразу, то о ней будет сообщено посредством aio_return(3) (возвращается состояние -1) и aio_error(3) (состояние ошибки — всё, что было бы в errno, например EBADF).

ОШИБКИ

EAGAIN
    Не хватает ресурсов.

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

EINVAL
    Одно или несколько значений у aio_offset, aio_reqprio или aio_nbytes неверны.

ENOSYS
    Функция aio_read() не реализована.

EOVERFLOW
    Файл является обычным файлом, мы начинаем читать его до конца файла и хотим получить не менее одного байта, но начальная позиция находится за максимальным значением смещения этого файла.

ВЕРСИИ
Функция aio_read() доступна в glibc начиная с версии 2.1.

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
aio_read() | Безвредность в нитях | MT-Safe

СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.

ЗАМЕЧАНИЯ
Желательно обнулять буфер блока управления перед использованием. Блок управления не должен изменяться во время выполнения операции чтения. Область буфера, в которую выполняется чтение, должна быть недоступна во время операции, иначе поведение непредсказуемо. Области памяти, с которыми производится работа, должны оставаться доступными.

Одновременное выполнение операций ввода-вывода через совместно используемую структуру aiocb приводит к непредсказуемым результатам.

ПРИМЕР
Смотрите aio(7).

СМОТРИТЕ ТАКЖЕ
aio_cancel(3), aio_error(3), aio_fsync(3), aio_return(3), aio_suspend(3), aio_write(3), lio_listio(3), aio(7)