Асинхронно прочитать из файла
#include <aio.h>int aio_read( struct aiocb *aiocbptr );
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
, статус ошибки устанавливается в соответствующее значение:
Если aio_read() успешно ставит в очередь операцию ввода/вывода, но в дальнейшем операция отменяется или вызывает ошибку, статус возврата асинхронной операции является одним из значений, обычно возвращаемых read(). Кроме того, статус ошибки асинхронной операции устанавливается в один из статусов ошибки, обычно устанавливаемый read(), или в один из следующих:
Следующие условия могут быть обнаружены синхронно или асинхронно:
0
, и начальное смещений aiocbptr->aio_offset находится на уровне или превышает максимальное смещение открытого файлового дескриптора, определяемого aiocbptr->aio_fildes.
POSIX 1003.1 Asynchronous Input/Output
При первом вызове функций aio_*() создается пул потоков, что делает процесс многопоточным, если он не был таковым. Пул потоков не уничтожится до тех пор, пока процесс не завершится.
struct aiocb, aio_cancel(), aio_error(), aio_fsync(), aio_return(), aio_suspend(), aio_write(), read()
Предыдущий раздел: Описание API системной библиотеки