POSIX 异步IO介绍

本文介绍了POSIX.1b定义的异步IO操作,它允许应用程序发起IO请求后立即返回,无需等待IO完成,提高了效率。核心结构是struct aiocb,包括文件描述符、偏移量、缓冲区等字段。主要API有aio_read、aio_write和lio_listio,分别用于异步读、写和批量IO操作。完成后的通知方式包括信号和回调函数。示例代码展示了如何通过信号SIGIO和回调函数通知IO完成。
摘要由CSDN通过智能技术生成

POSIX.1b定义了一系列新的IO操作,能较大地减少应用程序的IO等待时间。这些新函数允许应用程序发起一个或多个IO操作请求后立即返回做其他事情不必等到IO完成,IO操作可以跟应用程序并行执行。AIO控制块 struct aiocb 描述:

int aio_fildes
        需要操作的文件描述符,所关联的文件必须能支持seek操作。像pipe、socket等设备不能使用aio。
off_t aio_offset
        偏移量,aio将在文件的这个位置进行操作(读/写)。
volatile void* aio_buf
        指向缓冲区的指针,对于读操作该缓冲区用于存储读出来的数据;对于写操作则把需要写到文件的数据放在此缓冲区里面。
size_t aio_nbytes
        aio_buf所指向的缓冲区的长度。
int aio_reqprio
        AIO操作的优先级。
struct sigevent aio_sigevent
        当AIO操作结束(完成或者出错)时以什么样的方式通知调用aio的进程。aio_sigevent.sigev_notify为SIGEV_NONE表示不通知。SIGEV_SIGNAL表示以信号方式通知,aio_sigevent.sigev_signo指定用于通知的信号(一般用SIGIO)。除此以外,aio_sigevent.sigev_notify只能为SIGEV_THREAD,表示AIO操作结束时以线程的方式执行aio_sigevent.sigev_notify_function指定的函数。
int aio_lio_opcode
        这个参数仅当使用lio_listio时会用到,因为lio_listio允许同时发起一系列AIO操作,每个操作都可以是读或写,因此这个参数用来指定需要执行的操作,可以是:LIO_READ表示读,LIO_WRITE表示写,LIO_NOP表示无操作。

基本API:
int aio_read(struct aiocb *aiocbp)
        发起一个异步读操作,当请求开始排队或者排队之前发现错误时函数立即返回,不会像read一样阻塞。
        函数会从文件(aiocbp->aio_fildes)的指定位置(aiocbp->aio_offset)最多读取aiocbp->aio_nbytes字节数据到aiocbp->aio_buf中。如果系统支持把IO区别优先次序的话,进入排队之前会根据aiocbp->aio_reqprio调整优先级。
        读操作完成时会根据aiocbp->aio_sigevent指定的方式通知调用进程。
        aio_read返回0表示没有错误发生,否则返回-1,errno指出以下几种出错情况:
        EAGAIN
                资源(临时)不足,请求无法进入排队。
       

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值