aio_read()

Асинхронно прочитать из файла

Прототип:

#include <aio.h>
int aio_read( struct aiocb *aiocbptr );

Аргументы:

aiocbptr
Указатель на управляющий блок асинхронного ввода/вывода типа struct aiocb, который определяет, сколько данных должно быть прочитано и откуда.

Библиотека:

libc

Описание:

Функция aio_read() асинхронно считывает aiocbptr->aio_nbytes байт из файла, определяемого aiocbptr->aio_fildes, в буфер, на который указывает aiocbptr->aio_buf. Она завершается, когда чтение начинается или запрос ставится в очередь для файла или устройства (даже если данные не могут быть получены немедленно).

Асинхронная операция выполняется с приоритетом потока минус значение aiocbp->aio_reqprio.

Можно передать аргумент aiocbptr в функции aio_error() и aio_return() для того, чтобы определить статус ошибки и статус возврата для асинхронной операции во время ее выполнения. Если во время постановки в очередь возникает ошибка, вызов функции завершается без инициирования или постановки ее в очередь. Запрошенная операция выполняется для абсолютной позиции файла, заданной aiocbptr->aio_offset, как если бы перед операцией была вызвана функция lseek() со смещением, равным aiocbptr->aio_offset и whence, равным SEEK_SET. После успешного вызова постановки асинхронной операции ввода/вывода в очередь, значение смещения файла не определено.

Данная функция игнорирует поле aiocbptr->aio_lio_opcode.

Если буфер, на который указывает aiocbptr->aio_buf, или управляющий блок, на который указывает aiocbptr, получают некорректный адрес до завершения асинхронного ввода/вывода, поведение функции становится неопределенным.

Одновременные асинхронные операции, использующие одинаковый aiocbptr, приводят к неопределенным результатам.

Если для файла, ассоциированного с aiocbptr->aio_fildes, доступен синхронизованный ввод/вывод, данная функция ведет себя в соответствии с определением синхронизированного ввода/вывода целостности данных и файла.

Если действия системы изменяют пространство памяти процесса в то время, как асинхронный ввод/вывод ожидает изменения диапазона адресов, результат действий не определен.

Следующие условия могут быть обнаружены синхронно или асинхронно во время вызова aio_read(). Если любое из этих условий обнаружено синхронно, aio_read() возвращает -1 и устанавливает для errno соответствующее значение. Если любое из этих условий обнаружено асинхронно, статус возврата асинхронной операции устанавливается в -1, статус ошибки устанавливается в соответствующее значение:

EBADF
Аргумент aiocbptr->aio_fildes не является корректным файловым дескриптором, открытым для чтения.
EINVAL
Некорректное значение смещения файла aiocbptr->aio_offset, некорректное значение aiocbptr->aio_reqprio или aiocbptr->aio_nbytes.

Если aio_read() успешно ставит в очередь операцию ввода/вывода, но в дальнейшем операция отменяется или вызывает ошибку, статус возврата асинхронной операции является одним из значений, обычно возвращаемых read(). Кроме того, статус ошибки асинхронной операции устанавливается в один из статусов ошибки, обычно устанавливаемый read(), или в один из следующих:

EBADF
Аргумент aiocbptr->aio_fildes не является корректным файловым дескриптором, открытым для чтения.
ECANCELED
Запрашиваемая операция ввода/вывода была отменена до ее завершения из-за явного запроса aio_cancel().
EINVAL
Смещение файла, указанное в aiocbptr->aio_offset, некорректно.

Следующие условия могут быть обнаружены синхронно или асинхронно:

EOVERFLOW
Файл является обычным файлом, aiocbptr->aio_nbytes больше, чем 0, и начальное смещений aiocbptr->aio_offset находится на уровне или превышает максимальное смещение открытого файлового дескриптора, определяемого aiocbptr->aio_fildes.

Возвращаемое значение:

0
Успешное завершение. Операции были успешно добавлены в очередь.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

EAGAIN
Запрашиваемая асинхронная операция ввода/вывода не была помещена в очередь из-за системных ресурсных ограничений.

Классификация:

POSIX 1003.1 Asynchronous Input/Output

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Предостережения:

При первом вызове функций aio_*() создается пул потоков, что делает процесс многопоточным, если он не был таковым. Пул потоков не уничтожится до тех пор, пока процесс не завершится.

Тематические ссылки:

struct aiocb, aio_cancel(), aio_error(), aio_fsync(), aio_return(), aio_suspend(), aio_write(), read()




Предыдущий раздел: Описание API системной библиотеки