linux异步IO接口libaio

2020-12-09  本文已影响0人  再凌

libaio是异步读写IO的接口

有以下几个操纵的函数

int io_setup(unsigned nr_events,  aio_context_t *ctxp);//注册
int io_destroy(aio_context_t ctx);//销毁
int io_submit(aio_context_t ctx,  long nr,  struct iocb *cbp[]);//提交任务
int io_cancel(aio_context_t ctx,  struct iocb *,  struct io_event *result);//取消
int io_getevents(aio_context_t ctx, long min_nr, long nr, struct io_event *events, struct timespec *timeout);//得到结果

1. int io_setup(unsigned nr_events, aio_context_t *ctxp);

表示驻留在context中的IO总数, aio_context_t是一个long类型

2. int io_submit(aio_context_t ctx, long nr, struct iocb *cbp[])

    struct iocb cb; struct iocb *cbs[1]; //cb是一个临时结构体, cbs是装有一个struct iocb指针的数组
    cb.aio_fildes = fd; 
    cb.aio_lio_opcode = IOCB_CMD_PWRITE;/* command-specific options */ 
/*
IOCB_CMD_PREAD      读; 对应系统调用pread().
IOCB_CMD_PWRITE     写,对应系统调用pwrite().
IOCB_CMD_FSYNC      同步文件数据到磁盘,对应系统调用fsync()
IOCB_CMD_FDSYNC     同步文件数据到磁盘,对应系统调用fdatasync()
IOCB_CMD_PREADV     读,对应系统调用readv()
IOCB_CMD_PWRITEV    写,对应系统调用writev()
IOCB_CMD_NOOP       只是内核使用
*/
    cb.aio_buf = (uint64_t)data; 
    cb.aio_offset = 0; 
    cb.aio_nbytes = 4096; 
    cbs[0] = &cb;

其中的long nr指的是每一个cb的大小

3. int io_getevents(aio_context_t ctx, long min_nr, long nr, struct io_event *events, struct timespec *timeout)

提交任务后可以先处理其他事情, 等到系统完成IO操作后会填充event字段(失败成功均填充). 使用io_getevents去拷贝event.
min_nr代表本次取出的event最小数量 不够则会阻塞, 除非到达timeout时间返回
nr代表最大获取的event数量

取出的所有event放入events内存中

上一篇 下一篇

猜你喜欢

热点阅读