Инициировать список запросов ввода-вывода
#include <aio.h>int lio_listio( int mode,struct aiocb * const list[],int nent,struct sigevent *sig );
NULL
указатели, которые функция игнорирует._POSIX_AIO_MAX
.NULL
или указатель на структуру struct sigevent, которая определяет сигнал, который необходимо отправить вызывающему процессу, когда все операции ввода-вывода завершены. Функция игнорирует этот аргумент, если в mode установлен режим LIO_WAIT
.libc
Функция lio_listio() позволяет вызывающему процессу, облегченному процессу (LWP) или потоку инициировать список запросов ввода-вывода в рамках одного вызова функции.
Поле aio_lio_opcode каждой из структур struct aiocb в списке list определяет операцию, которую нужно выполнить (см. <aio.h>
):
LIO_READ
запрашивает вызов aio_read(). LIO_WRITE
запрашивает вызов aio_write(). LIO_NOP
заставляет игнорировать запись в списке. Если режим mode равен LIO_NOWAIT
, lio_listio() использует структуру struct sigevent, на которую указывает sig, чтобы определить оба сигнала, которые будут сгенерированны и как вызывающий процесс уведомляется о завершении операций ввода-вывода:
NULL
или элемент sigev_signo структуры struct sigevent равен нулю, то отправки сигнала не происходит. В противном случае номер сигнала, обозначенный sigev_signo, отправляется, когда все запросы в списке будут выполнены.
SIGEV_NONE
, по завершении ввода-вывода сигнал не отправляется, но статус ошибки и статус возврата для операции устанавливаются соответствующим образом.
SIGEV_SIGNAL
, сигнал, указанный в sig->sigev_signo, отправляется процессу. Если для этого номера сигнала установлен флаг SA_SIGINFO
, сигнал ставится в очередь для процесса, и значение, указанное в sig->sigev_value, становится компонентом si_value сгенерированного сигнала. Для обычных файлов передача данных за пределы максимального смещения, установленного в дескрипторе открытого файла, связанным с 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().
_POSIX_AIO_MAX
. _POSIX_AIO_LISTIO_MAX
. LIO_WAIT
. Невыполненные запросы ввода-вывода не отменяются. Используйте aio_fsync(), чтобы определить, был ли инициирован какой-либо запрос; aio_return(), чтобы определить, был ли выполнен какой-либо запрос; или aio_error(), чтобы определить, был ли какой-либо запрос отменен. Если либо lio_listio() помещает в очередь все свои запросы, либо в errno устанавливается одно из значений: EAGAIN
, EINTR
, или EIO
, - то некоторые операции ввода-вывода, указанные в списке, могли быть инициированы. В данном случае каждая из структур struct aiocb содержит ошибки характерные для функции read() или функция write() находится в процессе выполнения:
Следующие дополнительные коды ошибок могут быть установлены для каждого блока управления struct aiocb:
LIO_READ
, файл является обычным файлом, aiocbp->aio_nbytes больше чем 0
, и aiocbp->aio_offset находится перед концом файла и больше чем, либо равен максимальному смещению в дескрипторе открытого файла, связанного с aiocbp->aio_fildes. LIO_WRITE
, файл является обычным файлом, aiocbp->aio_nbytes больше чем 0
, и aiocbp->aio_offset больше чем, либо равен максимальному смещению в дескрипторе открытого файла, связанного с aiocbp->aio_fildes. POSIX 1003.1 Asynchronous Input/Output
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 системной библиотеки