Linux之异步I/O

提问:

  1. 异步I/O(AIO)有哪些接口?如何使用?
  2. 为什么需要异步I/O?优缺点是什么?

基本概念:

  1. 在异步非阻塞 I/O 中,我们可以同时发起多个传输操作。这需要每个传输操作都有惟一的上下文,这样我们才能在它们完成时区分到底是哪个传输操作完成了。在 AIO 中,这是一个 aiocb(AIO I/O Control Block)结构。这个结构包含了有关传输的所有信息,包括为数据准备的用户缓冲区。在产生 I/O (称为完成)通知时,aiocb 结构就被用来惟一标识所完成的 I/O 操作。

1.异步I/O(AIO)有哪些接口?如何使用?

1.1常用结构体和接口

API 函数

说明

aio_read

请求异步读操作

aio_error

检查异步请求的状态

aio_return

获得完成的异步请求的返回状态

aio_write

请求异步写操作

aio_suspend

挂起调用进程,直到一个或多个异步请求已经完成(或失败)

aio_cancel

取消异步 I/O 请求

lio_listio

发起一系列 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 。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值