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_nbytes 从 aio_buf指向的缓冲区写入与 aio_fildes 相关联的文件。 当写请求已启动或排队到文件或设备时,子例程返回。
aiocbp 参数可用作 aio_error 和 aio_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_write 或 aio_write64子例程与从对 shm_open 子例程的调用中获取的文件描述符配合使用,那么它将失败并返回 EINVAL。
参数
| 项 | 描述 |
|---|---|
| aiocbp | 指向与 I/O 操作关联的 aiocb 结构。 |
aiocb 结构
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_write 和 aio_write64 子例程。
返回值
如果 I/O 操作成功排队,那么 aio_write 子例程会将 0 返回到调用进程。 否则,将返回-1并设置errno全局变量来指示错误。
错误代码
| 项 | 描述 |
|---|---|
| 再次 | 由于系统资源限制,请求的异步 I/O 操作未排队。 |
| 项 | 描述 |
|---|---|
| EBADF | aio_fildes 参数不是打开用于写入的有效文件描述符。 |
| EINVAL | aio_offset 隐含的文件偏移值无效, aio_reqprio 是无效值,或者 aio_nbytes 是无效值。 aio_write 或 aio_write64 子例程用于从对 shm_open 子例程的调用中获取的文件描述符。 |
| 项 | 描述 |
|---|---|
| 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>
描述 (旧 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_write 或 aio_write64 子例程与从对 shm_open 子例程的调用中获取的文件描述符配合使用,那么它将失败并返回 EINVAL。
当写请求已排队时, aio_write 子例程将更新由aio_whence和aio_offsetaiocb 结构中的字段,如同所请求的 I/O 已完成一样。 然后返回到调用程序。 该aio_whence和aio_offset字段具有与 lseek 子例程中的 whence 和 offset 参数相同的含义。 对于无法查找的文件对象,子例程将忽略它们。
如果在调用期间发生错误,那么不会启动或排队写请求。 要确定请求的状态,请使用 aio_error 子例程。
要使调用进程在 I/O 操作完成时接收到 SIGIO 信号,请在aio_flagaiocb 结构中的字段。
#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 结构
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_write 和 aio_write64 子例程。
返回值 (旧 AIO aio_write 子例程)
当写请求队列成功时, aio_write 子例程返回值 0。 否则,返回值为-1,并设置errno全局变量来标识错误。
可将返回码设置为以下 errno 值:
| 项 | 描述 |
|---|---|
| 再次 | 指示排队请求所需的系统资源不可用。 具体而言,传输队列可能已满,或者可能已达到最大打开数。 |
| EBADF | 指示 FileDescriptor 参数无效。 |
| Efault | 指示 aiocbp 参数指定的地址无效。 |
| EINVAL | 指示aio_whence字段没有有效值或生成的指针无效。 aio_write 或 aio_write64 子例程用于从对 shm_open 子例程的调用中获取的文件描述符。 |
将 I/O 完成端口与 AIO 请求配合使用时,还可以将返回码设置为以下 errno 值:
| 项 | 描述 |
|---|---|
| EBADF | 指示aio_iocpfdaiocb 结构中的字段不是有效的 I/O 完成端口文件描述符。 |
| EINVAL | 指示尝试启动 AIO 请求时 I/O 完成端口服务失败。 |
| EPERM | 指示 I/O 完成端口服务不可用。 |