aio_read 或 aio_read64 子例程

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

POSIX AIO aio_read 子例程

用途

异步读取文件。

标准 C 库 (libc.a)

语法

#include <aio.h>

int aio_read (aiocbp)
struct aiocb *aiocbp;

描述

aio_read 子例程将 aio_nbytes 从与 aio_fildes 关联的文件读取到 aio_buf指向的缓冲区中。 当读请求已启动或排队到文件或设备时 (即使不能立即传递数据) ,子例程将返回。

aiocbp 值可用作 aio_erroraio_return 子例程的自变量,以便确定异步操作在继续时的错误状态和返回状态。 如果在排队期间迂到错误情况,那么函数调用将返回而不启动或排队请求。 请求的操作发生在文件中的绝对位置,如 aio_offset 所给出的那样,就好像在操作之前立即调用了 lseek 子例程,其偏移量等于 aio_offset ,而条件等于 SEEK_SET。 成功调用异步 I/O 操作入队后,未指定该文件的文件偏移量值。

aio_lio_opcode 字段被 aio_read 子例程忽略。

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

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

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

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

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

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

如果将 aio_readaio_read64 子例程与通过调用 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_readaio_read64 子例程。

返回值

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

错误代码

描述
再次 由于系统资源限制,请求的异步 I/O 操作未排队。

可以在调用 aio_read 子例程时同步检测以下每个条件,也可以异步检测。 如果同步检测到以下任何条件,aio_read子程序将返回-1并将errno全局变量设置为相应值。 如果异步检测到以下任一条件,异步操作的返回状态将设置为-1,异步操作的错误状态将设置为相应的值。

描述
EBADF aio_fildes 参数不是打开用于读取的有效文件描述符。
EINVAL aio_offset 隐含的文件偏移值无效, aio_reqprio 是无效值,或者 aio_nbytes 是无效值。 aio_readaio_read64 子例程与从对 shm_open 子例程的调用中获取的文件描述符一起使用。
如果 aio_read 子例程成功地使 I/O 操作排队,但该操作随后被取消或迂到错误,那么异步操作的返回状态是通常由 read 子例程返回的值之一。 此外,异步操作的错误状态设置为通常由 read 子例程设置的错误状态之一或下列其中一个值:
描述
EBADF aio_fildes 参数不是打开用于读取的有效文件描述符。
取消 由于显式 aio_cancel 请求,在 I/O 完成之前已取消所请求的 I/O。
EINVAL aio_offset 隐含的文件偏移值无效。
可以同步或异步检测以下情况:
描述
EOVERFLOW 该文件是常规文件, aio_nbytes 大于 0 ,并且 aio_offset 中的起始偏移量在文件结束之前,并且在与 aio_fildes关联的打开文件描述中的最大偏移量。

旧 AIO aio_read 子例程

用途: 从文件异步读取。

库 (旧 AIO aio_read 子例程)

标准 C 库 (libc.a)

语法 (旧 AIO aio_read 子例程)

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

描述 (旧 AIO aio_read 子例程)

aio_read 子例程从文件异步读取。 具体而言, aio_read 子例程从与 FileDescriptor 参数相关联的文件读取到缓冲区中。

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

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

如果将 aio_readaio_read64 子例程与通过调用 shm_open 子例程获得的文件描述符配合使用,那么它将失败并返回 EINVAL

读取的详细信息由 aiocb 结构中的信息提供,该结构由 aiocbp 参数指向。 此信息包含以下字段:

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

当读请求已排队时, aio_read 子例程将更新由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_read 子例程)

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

aiocb 结构

aiocbaiocb64 结构在 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_read 子例程)

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

返回值 (旧 AIO aio_read 子例程)

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

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

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

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

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

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