aio_write 或 aio_write64 子例程

aio_write 子例程包含 POSIX AIO aio_write 子例程 (如 IEEE std 1003.1-2001中所定义) 和 Legacy AIO aio_write 子例程的信息。

POSIX AIO aio_write 子例程

用途

异步写入文件。

标准 C 库 (libc.a)

语法

#include <aio.h>

int aio_write (aiocbp)
struct aiocb *aiocbp;

描述

aio_write 子例程将 aio_nbytesaio_buf指向的缓冲区写入与 aio_fildes 相关联的文件。 当写请求已启动或排队到文件或设备时,子例程返回。

aiocbp 参数可用作 aio_erroraio_return 子例程的自变量,以便确定异步操作在继续时的错误状态和返回状态。

aiocbp 参数指向 aiocb 结构。 如果 aio_buf 指向的缓冲区或 aiocbp 指向的控制块在异步 I/O 完成之前成为非法地址,那么行为未定义。

如果没有为 aio_fildes 文件描述符设置 O_APPEND 标志,那么请求的操作将在 aio_offset给出的文件中的绝对位置执行。 这样做就如同在操作之前立即调用了 lseek 子例程,其偏移量等于 aio_offset ,而条件等于 SEEK_SET。 如果为文件描述符设置了 O_APPEND 标志,那么除在 系统接口和 XBD 头 Web 站点的 "异步 I/O" 部分中描述的情况外,写操作将数据 (以字节为单位) 按调用的顺序附加到文件。 成功调用异步 I/O 操作入队后,未指定该文件的文件偏移量值。

aio_lio_opcode 字段被 aio_write 子例程忽略。

如果此文件支持优先 I/O ,那么将以等于进程调度优先级减去 aiocbp->aio_reqprio的优先级提交异步操作。

使用相同 aiocbp 的同时异步操作产生未定义的结果。

如果在与 aio_fildes关联的文件上启用了同步 I/O ,那么此子例程的行为将根据同步 I/O 数据完整性完成和同步 I/O 文件完整性完成的定义。

对于在异步 I/O 处于未完成状态时更改进程内存空间的任何系统操作,未定义该操作的结果。

对于常规文件,不会发生超过与 aio_fildes关联的打开文件描述中所确定的最大偏移量的数据传输。

如果将 aio_writeaio_write64子例程与从对 shm_open 子例程的调用中获取的文件描述符配合使用,那么它将失败并返回 EINVAL

参数

描述
aiocbp 指向与 I/O 操作关联的 aiocb 结构。

aiocb 结构

aiocb 结构在 /usr/include/aio.h 文件中定义,并包含以下成员:
int               aio_fildes
off_t             aio_offset
char             *aio_buf
size_t            aio_nbytes
int               aio_reqprio
struct sigevent   aio_sigevent
int               aio_lio_opcode

执行环境

只能从进程环境调用 aio_writeaio_write64 子例程。

返回值

如果 I/O 操作成功排队,那么 aio_write 子例程会将 0 返回到调用进程。 否则,将返回-1并设置errno全局变量来指示错误。

错误代码

描述
再次 由于系统资源限制,请求的异步 I/O 操作未排队。
可以在调用 aio_write时同步检测以下每个条件,也可以异步检测。 如果同步检测到以下任何条件,aio_write子程序将返回-1并将errno全局变量设置为相应值。 如果异步检测到以下任一条件,异步操作的返回状态将设置为-1,异步操作的错误状态将设置为相应的值。
描述
EBADF aio_fildes 参数不是打开用于写入的有效文件描述符。
EINVAL aio_offset 隐含的文件偏移值无效, aio_reqprio 是无效值,或者 aio_nbytes 是无效值。 aio_writeaio_write64 子例程用于从对 shm_open 子例程的调用中获取的文件描述符。
如果 aio_write 子例程成功使 I/O 操作排队,那么异步操作的返回状态是通常由 write 子例程调用返回的值之一。 如果操作已成功排队但随后被取消或迂到错误,那么异步操作的错误状态包含通常由 write 子例程调用设置的值之一或下列其中一项:
描述
EBADF aio_fildes 参数不是打开用于写入的有效文件描述符。
EINVAL aio_offset 隐含的文件偏移值将无效。
取消 由于 aio_cancel 请求,在 I/O 完成之前已取消所请求的 I/O。
可以同步或异步检测以下情况:
描述
EFBIG 该文件是常规文件, aio_nbytes 大于 0 ,并且 aio_offset 中的起始偏移量等于或超过与 aio_fildes关联的打开文件描述中的最大偏移量。

旧 AIO aio_write 子例程

用途: 异步写入文件。

库 (旧 AIO aio_write 子例程)

标准 C 库 (libc.a)

语法 (旧 AIO aio_write 子例程)

#include <aio.h>
int aio_write( FileDescriptor,  aiocbp)
int FileDescriptor;
struct aiocb *aiocbp;
int aio_write64( FileDescriptor,  aiocbp)
int FileDescriptor;
struct aiocb64 *aiocbp;

描述 (旧 AIO aio_write 子例程)

aio_write 子例程异步写入文件。 具体而言, aio_write 子例程从缓冲区写入与 FileDescriptor 参数相关联的文件。 为了处理此问题,子例程使用来自 aio 控制块 (aiocb) 结构的信息,该结构由 aiocbp 参数指向。 此信息包含以下字段:

描述
aio_buf 指示要使用的缓冲区。
aio_nbytes 指示要写入的字节数。

aio_write64 子例程类似于 aio_write 子例程,只是它采用 aiocb64 引用参数。 这允许 aio_write64 子例程指定超出 OFF_MAX (2 千兆字节减去 1) 的偏移量。

在启用了大文件的编程环境中, aio_read 将重新定义为 aio_read64

如果将 aio_writeaio_write64 子例程与从对 shm_open 子例程的调用中获取的文件描述符配合使用,那么它将失败并返回 EINVAL

当写请求已排队时, aio_write 子例程将更新由aio_whenceaio_offsetaiocb 结构中的字段,如同所请求的 I/O 已完成一样。 然后返回到调用程序。 该aio_whenceaio_offset字段具有与 lseek 子例程中的 whenceoffset 参数相同的含义。 对于无法查找的文件对象,子例程将忽略它们。

如果在调用期间发生错误,那么不会启动或排队写请求。 要确定请求的状态,请使用 aio_error 子例程。

要使调用进程在 I/O 操作完成时接收到 SIGIO 信号,请在aio_flagaiocb 结构中的字段。

注: aiocb 结构中的 事件 结构当前未在使用,但为了将来的兼容性而包含在内。
注: 当使用 aio.h 编译具有旧 AIO 函数定义的 aio 应用程序时,必须定义 aio.h 中使用的 _AIO_AIX_SOURCE 宏。 使用 aio.h 文件进行的缺省编译适用于具有 POSIX AIO 定义的应用程序。 在源文件中输入:
#define _AIO_AIX_SOURCE
#include <sys/aio.h>
或者,在编译时在命令行上输入:
->xlc ... -D_AIO_AIX_SOURCE ... legacy_aio_program.c 

由于此时不支持优先 I/O ,因此目前不使用结构的 aio_reqprio 字段。

参数 (旧 AIO aio_write 子例程)

描述
FileDescriptor 标识从打开调用返回的要写入的对象。
aiocbp 指向与 I/O 操作关联的异步 I/O 控制块结构。

aiocb 结构

aiocb 结构在 /usr/include/aio.h 文件中定义,并包含以下成员:
struct aiocb
{
       int                 aio_whence;
       off_t               aio_offset;
       char                *aio_buf;
       ssize_t             aio_return;
       int                 aio_errno;
       size_t              aio_nbytes;
       union {
              int          reqprio;
              struct {
                     int   version:8;
                     int   priority:8;
                     int   cache_hint:16;
              } ext;
       } aio_u1;
       int                 aio_flag;
       int                 aio_iocpfd;
       aio_handle_t        aio_handle;
}

#define aio_reqprio        aio_u1.reqprio
#define aio_version        aio_u1.ext.version
#define aio_priority       aio_u1.ext.priority
#define aio_cache_hint     aio_u1.ext.cache_hint

执行环境 (旧 AIO aio_write 子例程)

只能从进程环境调用 aio_writeaio_write64 子例程。

返回值 (旧 AIO aio_write 子例程)

当写请求队列成功时, aio_write 子例程返回值 0。 否则,返回值为-1,并设置errno全局变量来标识错误。

可将返回码设置为以下 errno 值:

描述
再次 指示排队请求所需的系统资源不可用。 具体而言,传输队列可能已满,或者可能已达到最大打开数。
EBADF 指示 FileDescriptor 参数无效。
Efault 指示 aiocbp 参数指定的地址无效。
EINVAL 指示aio_whence字段没有有效值或生成的指针无效。 aio_writeaio_write64 子例程用于从对 shm_open 子例程的调用中获取的文件描述符。

将 I/O 完成端口与 AIO 请求配合使用时,还可以将返回码设置为以下 errno 值:

描述
EBADF 指示aio_iocpfdaiocb 结构中的字段不是有效的 I/O 完成端口文件描述符。
EINVAL 指示尝试启动 AIO 请求时 I/O 完成端口服务失败。
EPERM 指示 I/O 完成端口服务不可用。

注: 如果在 I/O 操作期间迂到错误,那么 aio_error 子例程可能会返回 /usr/include/sys/errno.h 文件中定义的其他错误代码。