aio_nwait 子例程
用途
暂挂呼叫进程,直到完成特定数目的异步 I/O 请求。
库
标准 C 库 (libc.a)
语法
描述
虽然 aio_nwait 子例程包含在 POSIX AIO 中,但它不是 POSIX AIO 的标准定义的一部分。
aio_nwait 子例程暂挂调用进程,直到完成特定数目 (nwait) 的异步 I/O 请求。 这些请求在较早时由 lio_listio 子例程启动,该子例程使用 LIO_NOWAIT_AIOWAIT cmd 参数。 aio_nwait 子例程填充指向 list 中已完成的请求的 aiocb 指针,并返回 list中的有效条目数。 cnt 参数是 list 可以保留的 aiocb 指针的最大数目 (cnt > = nwait)。 如果没有更多暂挂的 aio 请求,那么当完成的请求数小于 nwait 时,子例程也会返回。
aio_suspend 子例程在任何一个指定的请求完成后返回。 在完成特定数目 (nwait 或更多) 的请求之后,返回 aio_nwait 子例程。
| aio_suspend: | aio_nwait: |
|---|---|
| 需要用户构建控制块列表,每个控制块都与他们要等待的 I/O 操作相关联。 | 要求用户提供数组以将 aiocb 地址信息放入其中。 不需要知道特定的 aio 控制块。 |
| 当指定的任何一个控制块指示与该控制块关联的 I/O 已完成时返回。 | 在完成 nwait 请求量或不处理其他请求时返回。 |
| 在调用子例程之前,可以更新 aio 控制块。 其他轮询方法 (例如 aio_error 子例程) 也可用于查看 aio 控制块。 | 调用 aio 控制块时更新其本身。 在调用 aio_nwait 子例程足够多的时间来覆盖使用 lio_listio 子例程指定的所有 aio 请求之后,才能使用其他轮询方法。 |
| 仅根据 LIO_NOWAIT_AIOWAIT 命令使用,该命令是与 lio_listio 子例程关联的命令之一。 如果未首先将 lio_listio 子例程与 LIO_NOWAIT_AIOWAIT 命令配合使用,那么无法调用 aio_nwait 。 aio_nwait 子例程仅影响由指定进程的一个或多个 lio_listio 调用的那些请求。 |
参数
| 项 | 描述 |
|---|---|
| Cnt | 指定列表数组中的条目数。 此数字必须大于 0 且小于 64 000。 |
| nwait | 指定等待的最小请求数。 此数字必须大于 0 且小于或等于 cnt 参数指定的值。 |
| list | 指向 aio.h 文件中定义的 aio 控制结构的指针数组。 |
返回值
返回值是 aio_nwait 子例程等待完成的请求总数。 不能超过 cnt。 虽然 nwait 是需要查找的请求量,但返回的实际量可能小于,等于或大于 nwait。 返回值指示要访问的列表数组的数量。
如果 lio_listio 子例程启动的请求超过 nwait 请求,并且 cnt 变量大于 nwait,那么返回值可能大于 nwait 值。 nwait 参数表示返回值所需的最小值, cnt 是返回的可能最大值。
如果由 lio_listio 子例程启动的某些请求发生在高活动时间,并且缺少可用于请求数的资源,那么返回值可能小于 nwait 值。 可能会在某些请求的 aio 控制块中返回 EAGAIN (错误稍后重试) ,但 aio_nwait 子例程不会看到这些请求。 在这种情况下,在调用 aio_nwait 子例程之后,必须使用 aio_error 子例程来访问列表上找不到的 aiocb 地址。 如果发生此情况,您可能需要增加 aio 参数 max servers 或 max requests 。 增大参数将确保对系统进行正确调整,并且不太可能发生 EAGAIN 错误。
如果出现错误,aio_nwait子程序将返回-1值,并设置errno全局变量来标识错误。 可将返回码设置为以下 errno 值:
| 项 | 描述 |
|---|---|
| EBUSY | 正在进行 aio_nwait 调用。 |
| EINVAL | 应用程序已检索所有 aiocb 指针,但用户缓冲区没有足够的空间用于这些指针。 |
| EINVAL | 没有未完成的异步 I/O 调用。 |
| EINVAL | 指定无效的 cnt 或 nwait 值。 |