(2021 年中)正如@oakad 在评论中所说,io_uring
系统调用当前没有被 libc 包装。如果用户想要调用原始io_uring
系统调用(例如,如 中所述io_uring_setup(2)
),则由他们提供额外的样板来执行此操作并确保他们遵守所有预期的规则......而不是手动完成所有事情,使用liburing看起来更容易(io_uring
包装库)。
我不清楚你为什么选择使用
#include <kernel/io_uring.h>
——这看起来不对。我系统上的标题是由
#include <linux/io_uring.h>
并且以下在我的系统上编译没有错误:
/* Needed for memset */
#include <stdio.h>
/* Needed for perror */
#include <string.h>
/* Needed to invoke the syscall */
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
/* Needed for io_uring data structures. Compilation will error with a "No such
* file or directory" on the following include line if your kernel headers are
* too old/don't know about io_uring. If this happens you have to manually
* declare all the io_uring structures/defines yourself. */
#include <linux/io_uring.h>
/* C libraries don't (yet) provide a pretty wrapper for the io_uring syscalls
* so create an io_uring_setup syscall wrapper ourselves */
int io_uring_setup(unsigned int entries, struct io_uring_params *p) {
return syscall(__NR_io_uring_setup, entries, p);
}
int main() {
int fd;
struct io_uring_params p;
memset(&p, 0, sizeof(p));
fd = io_uring_setup(512, &p);
if (fd < 0)
perror("io_uring_setup");
return 0;
}
然而,正如Efficient IO with io_uring PDFio_uring
中提到的,这只是通过直接系统调用使用时的冰山一角。io_uring 教程之王有一个名为The Low-level io_uring Interface的部分,它更详细地描述了用法,但使用起来io_uring
看起来更容易也更安全。