提问:
- 异步I/O(AIO)有哪些接口?如何使用?
- 为什么需要异步I/O?优缺点是什么?
基本概念:
- 在异步非阻塞 I/O 中,我们可以同时发起多个传输操作。这需要每个传输操作都有惟一的上下文,这样我们才能在它们完成时区分到底是哪个传输操作完成了。在 AIO 中,这是一个
aiocb
(AIO I/O Control Block)结构。这个结构包含了有关传输的所有信息,包括为数据准备的用户缓冲区。在产生 I/O (称为完成)通知时,aiocb
结构就被用来惟一标识所完成的 I/O 操作。
1.异步I/O(AIO)有哪些接口?如何使用?
1.1常用结构体和接口
API 函数 |
说明 |
|
请求异步读操作 |
|
检查异步请求的状态 |
|
获得完成的异步请求的返回状态 |
|
请求异步写操作 |
|
挂起调用进程,直到一个或多个异步请求已经完成(或失败) |
|
取消异步 I/O 请求 |
|
发起一系列 I/O 操作 |
1.1.1结构体
manual手册中的截图
struct aiocb {
int aio_fildes; //文件描述符,可以使socket
int aio_offset; //文件内偏移量
volatile void *aio_buf; //缓冲区的地址(指针)
size_t aio_nbytes; //传输长度
int aio_reqprio; //响应优先级
struct sigevent aio_sigevent; //通知方式
int aio_lio_opcode;
...
};
1.1.2 aio_read 库函数
#include <aio.h>
int aio_read(struct aiocb *aiocbp);
Link with -lrt
本函数从aiocbp.aio_fildes指向的文件中读取aiocbp.aio_nbytes字节数的数据至aiocbp.aio_buf指向的缓冲区。
读取的起始地址由aiocbp.aio_offset指定。
成功返回0,失败返回-1,表示请求失败,并设置errno值。
如果是之后出现的错误,会有aio_return()和aio_error()得到相应返回值和errno 。
1.1.3 aio_write 库函数
#include <aio.h>
int aio_write(struct aiocb *aiocbp);
Link with -lrt
本函数从aiocbp.aio_buf指向的缓冲区中读取aiocbp.aio_nbytes字节数的数据至aiocbp.aio_fildes指向的文件。
写入的起始地址由aiocbp.aio_offset指定。
成功返回0,失败返回-1,表示请求失败,并设置errno值。
如果是之后出现的错误,会有aio_return()和aio_error()得到相应返回值和errno 。