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内存中
网友评论