1# liburing 2 3由于直接使用系统调用较为复杂,Jens Axboe 还提供了封装好的用户态库liburing,简化了io_uring的使用。 4liburing提供了初始化和释放io_uring实例的帮助程序,以及为不需要(或不希望)处理完整内核端实现的应用程序提供简化的接口。 5 6## 目录结构 7 8``` 9debian/ 10example/ #样例代码 11man/ 12src/liburing #库源代码 13test/ #测试脚本代码 14``` 15 16 17## OpenHarmony如何使用liburing 18 19OpenHarmony中系统部件需要在BUILD.gn中引用liburing部件以使用liburing。 20 21``` 22// BUILD.gn 23external_deps += [ "liburing:liburing" ] 24``` 25 26## 使用liburing库开发步骤 27 281. 初始化 29 ``` 30 extern int io_uring_queue_init_params(unsigned entries, struct io_uring ring,struct io_uring_params p); 31 extern int io_uring_queue_init(unsigned entries, struct io_uring ring, unsigned flags); 32 entries 表示队列大小 33 ring 就是需要初始化的io_uring结构指针 34 flags是标志参数,此值会改变io_uring_params p->flags 35 io_uring_params *p更多的设置 36 ``` 372. 创建请求(获取一个sqe请求并初始化) 38 ``` 39 extern struct io_uring_sqe io_uring_get_sqe(struct io_uring ring); 40 static inline void io_uring_prep_readv(struct io_uring_sqe sqe,int fd, const struct iovec iovecs, unsigned nr_vecs,off_t offset); 41 static inline void io_uring_prep_writev(struct io_uring_sqe sqe,int fd, const struct iovec iovecs, unsigned nr_vecs,off_t offset); 42 sqe即前面获取的sqe结构指针 43 fd为需要读写的文件描述符,可以是磁盘文件也可以是socket 44 iovecs为iovec数组,具体使用请参照readv和writev 45 nr_vecs 为iovecs数组元素个数 46 offset 为文件操作的偏移量 47 ``` 483. 传入用户数据 49 ``` 50 static inline void io_uring_sqe_set_data(struct io_uring_sqe *sqe, void *data); 51 ``` 524. 提交请求 53 ``` 54 extern int io_uring_submit(struct io_uring *ring); 55 extern int io_uring_submit_and_wait(struct io_uring *ring, unsigned wait_nr); 56 wait_nr 等待事件数量 57 ``` 585. 获取结果(提取完成事件) 59 ``` 60 static inline int io_uring_peek_cqe(struct io_uring *ring, struct io_uring_cqe **cqe_ptr); 61 static inline int io_uring_wait_cqe(struct io_uring *ring, struct io_uring_cqe **cqe_ptr); 62 63 cqe_ptr 输出参数,是cqe指针变量的地址 64 注意:io_uring_peek_cqe如果没有已完成的IO操作时,也会立即返回,cqe_ptr被置空;而io_uring_wait_cqe会阻塞线程,等待IO操作完成。 65 ``` 666. 获取数据 67 ``` 68 static inline void *io_uring_cqe_get_data(const struct io_uring_cqe *cqe); 69 ``` 707. 清理处理完成的结果 71 ``` 72 static inline void io_uring_cqe_seen(struct io_uring *ring, struct io_uring_cqe *cqe); 73 ``` 748. 释放 75 ``` 76 extern void io_uring_queue_exit(struct io_uring *ring); 77 ``` 78 79## 相关仓<a name="section178mcpsimp"></a> 80 81- [**基础文件访问接口**](https://gitee.com/openharmony/filemanagement_file_api) 82