Initiate a list of I/O requests
#include <aio.h>
int lio_listio( int mode,
struct aiocb* const list[],
int nent,
struct sigevent* sig );
- mode
- The mode of operation; one of:
- LIO_WAIT — lio_listio() behaves
synchronously, waiting until all I/O is completed, and ignores the
sig argument.
- LIO_NOWAIT — lio_listio() behaves
asynchronously, returning immediately, and the signal specified by
the sig argument is delivered to the calling process when
all the I/O operations from this function are completed.
- list
- An array of pointers to
aiocb
structures that specify
the I/O operations that you want to initiate.
The array may contain NULL pointers, which the function
ignores.
- nent
- The number of entries in the list array.
This must not exceed the system-wide limit, _POSIX_AIO_MAX.
- sig
- NULL, or a pointer to a
sigevent
structure that specifies the signal that you want to deliver to the
calling process when all of the I/O operations are completed.
The function ignores this argument if mode is
LIO_WAIT.
libc
Use the -l c option to
qcc
to link against this library.
This library is usually included automatically.
The lio_listio() function lets the calling process,
lightweight process (LWP),
or thread initiate a list of I/O requests within a single function call.
The aio_lio_opcode field of each aiocb structure
in list specifies the operation to be performed (see
<aio.h>):
- LIO_READ requests
aio_read().
- LIO_WRITE requests
aio_write().
- LIO_NOP causes the list entry to be ignored.
If mode is LIO_NOWAIT, lio_listio()
uses the
sigevent
structure pointed to by sig to define both the signal to
be generated and how the calling process is notified when the I/O operations
are complete:
- If sig is NULL, or the sigev_signo
member of the sigevent structure is zero,
then no signal delivery occurs.
Otherwise, the signal number indicated by sigev_signo is
delivered when all the requests in the list have been completed.
- If sig->sigev_notify is SIGEV_NONE,
no signal is posted upon I/O completion, but the
error status and the return status for the operation are set appropriately.
- If sig->sigev_notify is
SIGEV_SIGNAL, the signal specified in
sig->sigev_signo is sent
to the process. If the SA_SIGINFO flag is set for that
signal number, the signal is queued to the process,
and the value specified in sig->sigev_value
is the si_value component of the generated signal.
For regular files, no data transfer occurs past the
offset maximum established in the open file description
associated with aiocbp->aio_fildes.
The behavior of this function is altered according to the
definitions of synchronized I/O data integrity completion
and synchronized I/O file integrity completion if synchronized
I/O is enabled on the file associated with aio_fildes.
(see the definitions of O_DSYNC and O_SYNC
in the description of
fcntl().)
If the mode argument is LIO_NOWAIT,
and the I/O
operations are successfully queued, lio_listio() returns 0;
otherwise, it returns -1, and sets
errno.
If the mode argument is LIO_WAIT, and all the
indicated I/O has been completed successfully, lio_listio()
returns 0; otherwise, it returns -1, and sets errno.
In either case, the return value indicates only the success
or failure of the lio_listio() call itself, not the status
of the individual I/O requests. In some cases, one or more
of the I/O requests contained in the list may fail. Failure
of an individual request doesn't prevent completion of any
other individual request. To determine the outcome of each
I/O request, examine the error status
associated with each aiocb control block. Each error status
so returned is identical to that returned as a result of calling
aio_read() or aio_write().
- EAGAIN
- The resources necessary to queue all the I/O
requests weren't available. The error status for each request is
recorded in the aio_error member of the corresponding
aiocb structure, and can be retrieved using
aio_error().
The number of entries, nent, exceeds the system-wide limit,
_POSIX_AIO_MAX.
- EINVAL
- The mode argument is invalid.
The value of nent is greater than _POSIX_AIO_LISTIO_MAX.
- EINTR
- A signal was delivered while waiting for all
I/O requests to be completed during an LIO_WAIT
operation. However, the outstanding I/O requests aren't canceled.
Use aio_fsync()
to determine if any request was initiated;
aio_return() to
determine if any request has been completed; or aio_error()
to determine if any request was canceled.
- EIO
- One or more of the individual I/O operations
failed. Use aio_error() with each aiocb
structure to determine which request(s) failed.
- ENOSYS
- The lio_listio() function isn't supported by this
implementation.
If either lio_listio() succeeds in queuing all of its
requests, or errno is set to EAGAIN,
EINTR, or EIO, then
some of the I/O specified from the list may have been initiated.
In this event, each aiocb structure contains errors
specific to the
read()
or
write()
function being performed:
- EAGAIN
- The requested I/O operation wasn't queued due to resource limitations.
- ECANCELED
- The requested I/O was canceled before the I/O was completed due to an
explicit
aio_cancel()
request.
- EINPROGRESS
- The requested I/O is in progress.
The following additional error codes may be set
for each aiocb control block:
- EOVERFLOW
- The aiocbp->aio_lio_opcode is
LIO_READ, the file is a regular file,
aiocbp->aio_nbytes is greater than 0, and the
aiocbp->aio_offset is before the end-of-file
and is greater than or equal to the offset maximum in the open file
description associated with aiocbp->aio_fildes.
- EFBIG
- The aiocbp->aio_lio_opcode is
LIO_WRITE, the file is a regular file,
aiocbp->aio_nbytes is greater than 0, and the
aiocbp->aio_offset is greater than or equal
to the offset maximum in the open file description associated with
aiocbp->aio_fildes.
POSIX 1003.1 AIO
Safety: | |
Cancellation point |
No |
Interrupt handler |
No |
Signal handler |
Yes |
Thread |
Yes |
aio_cancel(),
aio_error(),
aio_fsync(),
aio_read(),
aio_return(),
aio_write(),
aiocb,
close(),
execl(),
execle(),
execlp(),
execlpe(),
execv(),
execve(),
execvp(),
execvpe(),
exit(),
fcntl(),
fork(),
lseek(),
read(),
sigevent,
write()