aio_write,
    aio_write2, aio_writev
    — asynchronous write to a file (REALTIME)
Standard C Library (libc, -lc)
#include
  <aio.h>
int
  
  aio_write(struct
    aiocb *iocb);
int
  
  aio_write2(struct
    aiocb *iocb, int
    flags);
#include
    <sys/uio.h>
int
  
  aio_writev(struct
    aiocb *iocb);
The
    aio_write(),
    aio_write2(), and
    aio_writev() system calls allow the calling process
    to write to the descriptor iocb->aio_fildes. The
    syscalls return immediately after the write request has been enqueued to the
    descriptor; the write may or may not have completed at the time the call
    returns.
The
    aio_write()
    call will write iocb->aio_nbytes from the buffer
    pointed to by iocb->aio_buf, whereas
    aio_writev() gathers the data from the
    iocb->aio_iovcnt buffers specified by the members
    of the iocb->aio_iov array.
If the request could not be enqueued, generally due to invalid
    arguments, the call returns without having enqueued the request.
For
    aio_writev()
    the iovec structure is defined in
    writev(2).
If O_APPEND is set for
    iocb->aio_fildes, write operations append to the
    file in the same order as the calls were made. If
    O_APPEND is not set for the file descriptor, the
    write operation for
    aio_write()
    will occur at the absolute position from the beginning of the file plus
    iocb->aio_offset.
The
    aio_write2()
    call takes the flags argument. If
    flags is passed as zero, the call behaves identically
    to aio_write(). The following flags can be specified
    by logical or:
  - AIO_OP2_FOFFSET
- The write for non O_APPENDfile descriptors occurs
      at the file descriptor offset, which is advanced by the operation as done
      by the
      write(2)
      syscall. The iocb->aio_offset field is
    ignored.
- AIO_OP2_VECTORED
- Similar to aio_writev(), the write buffers are
      specified by the aiocb->aio_iov array.
The iocb pointer may be
    subsequently used as an argument to
    aio_return()
    and
    aio_error()
    in order to determine return or error status for the enqueued operation
    while it is in progress.
If the request is successfully enqueued, the value of
    iocb->aio_offset can be modified during the request
    as context, so this value must not be referenced after the request is
    enqueued.
The iocb->aio_sigevent structure can be
    used to request notification of the operation's completion as described in
    aio(4).
The Asynchronous I/O Control Block structure pointed to by
    iocb and the buffer that the
    iocb->aio_buf member of that structure references
    must remain valid until the operation has completed.
The asynchronous I/O control buffer iocb
    should be zeroed before the system calls to avoid passing bogus context
    information to the kernel.
Modifications of the Asynchronous I/O Control Block structure or
    the buffer contents are not allowed while the request is queued.
If the file offset in iocb->aio_offset is
    past the offset maximum for iocb->aio_fildes, no
    I/O will occur.
The aio_write() and
    aio_writev() functions return the value 0 if
    successful; otherwise the value -1 is returned and the global
    variable errno is set to indicate the error.
The aio_write(),
    aio_write2(), and
    aio_writev() system calls will fail if:
  - [EAGAIN]
- The request was not queued because of system resource limitations.
- [EFAULT]
- Part of aio_iov points outside the process's
      allocated address space.
- [EINVAL]
- The asynchronous notification method in
      iocb->aio_sigevent.sigev_notify is invalid or not
      supported.
- [EOPNOTSUPP]
- Asynchronous write operations on the file descriptor
      iocb->aio_fildes are unsafe and unsafe
      asynchronous I/O operations are disabled.
The following conditions may be synchronously detected when the
    aio_write(), aio_write2(),
    or aio_writev() system call is made, or
    asynchronously, at any time thereafter. If they are detected at call time,
    the calls return -1 and set errno appropriately;
    otherwise the aio_return() system call must be
    called, and will return -1, and aio_error() must be
    called to determine the actual value that would have been returned in
    errno.
  - [EBADF]
- The iocb->aio_fildes argument is invalid, or is
      not opened for writing.
- [EINVAL]
- The offset iocb->aio_offset is not valid, the
      priority specified by iocb->aio_reqprio is not a
      valid priority, or the number of bytes specified by
      iocb->aio_nbytes is not valid.
If the request is successfully enqueued, but subsequently canceled
    or an error occurs, the value returned by the
    aio_return() system call is per the
    write(2)
    system call, and the value returned by the
    aio_error() system call is either one of the error
    returns from the
    write(2)
    system call, or one of:
  - [EBADF]
- The iocb->aio_fildes argument is invalid for
      writing.
- [ECANCELED]
- The request was explicitly canceled via a call to
      aio_cancel().
- [EINVAL]
- The offset iocb->aio_offset would be
    invalid.
The aio_write() system call is expected to
    conform to the IEEE Std 1003.1
    (“POSIX.1”) standard.
The aio_write2() and
    aio_writev() system calls are FreeBSD extensions,
    and should not be used in portable code.
The aio_write() system call first appeared
    in FreeBSD 3.0. The
    aio_writev() system call first appeared in
    FreeBSD 13.0. The
    aio_write2() system call first appeared in
    FreeBSD 14.1.
Invalid information in
    iocb->_aiocb_private may confuse the kernel.