lio_listio()

Инициировать список запросов ввода-вывода

Прототип:

#include <aio.h>
int lio_listio( int mode,
struct aiocb * const list[],
int nent,
struct sigevent *sig );

Аргументы:

mode
Режимы работы:
LIO_WAIT
lio_listio() ведет себя синхронно, ожидая завершения всех операций ввода-вывода и игнорируя аргумент sig.
LIO_NOWAIT
lio_listio() ведет себя асинхронно и немедленно возвращается, а сигнал, указанный аргументом sig, отправляется вызывающему процессу, когда все операции ввода-вывода из этой функции завершены.
list
Массив указателей на структуры struct aiocb, которые определяют операции ввода-вывода, которые необходимо инициировать. Массив может содержать NULL указатели, которые функция игнорирует.
nent
Число записей в массиве list. Это число не должно превышать общесистемный предел _POSIX_AIO_MAX.
sig
NULL или указатель на структуру struct sigevent, которая определяет сигнал, который необходимо отправить вызывающему процессу, когда все операции ввода-вывода завершены. Функция игнорирует этот аргумент, если в mode установлен режим LIO_WAIT.

Библиотека:

libc

Описание:

Функция lio_listio() позволяет вызывающему процессу, облегченному процессу (LWP) или потоку инициировать список запросов ввода-вывода в рамках одного вызова функции.

Поле aio_lio_opcode каждой из структур struct aiocb в списке list определяет операцию, которую нужно выполнить (см. <aio.h>):

Если режим mode равен LIO_NOWAIT, lio_listio() использует структуру struct sigevent, на которую указывает sig, чтобы определить оба сигнала, которые будут сгенерированны и как вызывающий процесс уведомляется о завершении операций ввода-вывода:

Для обычных файлов передача данных за пределы максимального смещения, установленного в дескрипторе открытого файла, связанным с aiocbp->aio_fildes, не происходит.

Поведение этой функции изменяется в соответствии с целостностью синхронизированных данных ввода-вывода и целостностью синхронизированных файлов ввода-вывода, если синхронизированный ввод-вывод включен для файла, связанного с aio_fildes. (см. определения O_DSYNC и O_SYNC в описании fcntl().)

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

Если аргумент режима mode равен LIO_NOWAIT и операции ввода-вывода успешно поставлены в очередь, lio_listio() возвращает 0; в противном случае он возвращает -1 и устанавливает значение ошибки errno.

Если аргумент режима равен LIO_WAIT, и все указанные операции ввода-вывода были выполнены успешно, lio_listio() возвращает 0; в противном случае он возвращает -1 и устанавливает значение ошибки errno.

В любом случае возвращаемое значение указывает только на успех или на неудачу самого вызова lio_listio(), а не на состояние отдельных запросов ввода-вывода. В некоторых случаях один или несколько запросов ввода-вывода, содержащихся в списке, могут завершиться ошибкой. Невыполнение отдельного запроса не препятствует выполнению любого другого индивидуального запроса. Чтобы определить результат каждого запроса ввода-вывода, проверьте статус ошибки, связанный с каждым блоком управления struct aiocb. Каждый возвращаемый статус ошибки идентичен статусу, возвращаемому в результате вызова aio_read() или aio_write().

Коды ошибок:

EAGAIN
Ресурсы, необходимые для постановки в очередь всех запросов ввода-вывода, были недоступны. Статус ошибки для каждого запроса записывается в элементе aio_error соответствующей структуры struct aiocb, и его можно получить с помощью функции aio_error(). Число записей nent превышает общесистемный предел _POSIX_AIO_MAX.
EINVAL
Аргумент режима mode недопустим. Значение nent больше, чем _POSIX_AIO_LISTIO_MAX.
EINTR
Сигнал был доставлен во время ожидания завершения всех запросов ввода-вывода операции LIO_WAIT. Невыполненные запросы ввода-вывода не отменяются. Используйте aio_fsync(), чтобы определить, был ли инициирован какой-либо запрос; aio_return(), чтобы определить, был ли выполнен какой-либо запрос; или aio_error(), чтобы определить, был ли какой-либо запрос отменен.
EIO
Не удалось выполнить одну или несколько отдельных операций ввода-вывода. Используйте aio_error() с каждой из структур struct aiocb, чтобы определить какую операцию не удалось выполнить.
ENOSYS
Функция lio_listio() не поддерживается этой реализацией.

Если либо lio_listio() помещает в очередь все свои запросы, либо в errno устанавливается одно из значений: EAGAIN, EINTR, или EIO, - то некоторые операции ввода-вывода, указанные в списке, могли быть инициированы. В данном случае каждая из структур struct aiocb содержит ошибки характерные для функции read() или функция write() находится в процессе выполнения:

EAGAIN
Запрошенная операция ввода-вывода не была поставлена ​​в очередь из-за ограничений ресурсов.
ECANCELED
Запрошенный ввод-вывод был отменен до его завершения из-за явного запроса aio_cancel().
EINPROGRESS
Запрошенный ввод-вывод в процессе выполнения.

Следующие дополнительные коды ошибок могут быть установлены для каждого блока управления struct aiocb:

EOVERFLOW
aiocbp->aio_lio_opcode - это LIO_READ, файл является обычным файлом, aiocbp->aio_nbytes больше чем 0, и aiocbp->aio_offset находится перед концом файла и больше чем, либо равен максимальному смещению в дескрипторе открытого файла, связанного с aiocbp->aio_fildes.
EFBIG
aiocbp->aio_lio_opcode - это LIO_WRITE, файл является обычным файлом, aiocbp->aio_nbytes больше чем 0, и aiocbp->aio_offset больше чем, либо равен максимальному смещению в дескрипторе открытого файла, связанного с aiocbp->aio_fildes.

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

POSIX 1003.1 AIO

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

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

aio_cancel(), aio_error(), aio_fsync(), aio_read(), aio_return(), aio_write(), struct aiocb, close(), execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe(), exit(), fcntl(), fork(), lseek(), read(), struct sigevent, write()




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