[英]Trouble compiling io_uring
我一直在閱讀https://kernel.dk/io_uring.pdf並且我想嘗試實際的系統調用(io_uring_setup,io_uring_enter)來檢查我的理解,但我無法編譯以下簡單程序:
#include <kernel/io_uring.h>
#include <stdint.h>
int main() {
struct io_uring_params p;
int ring = io_uring_setup((__u32) 512, &p);
return 0;
}
我收到 io_uring_setup function 的隱式聲明錯誤。 The man page https://manpages.debian.org/unstable/liburing-dev/io_uring_setup.2.en.html suggests that the only file to include is linux/io_uring.h, but when I look at the source code, I看不到io_uring_setup的定義。
(2021 年中)正如@oakad 在評論中所說, io_uring
系統調用當前沒有被 libc 包裝。 如果用戶想要調用原始io_uring
系統調用(例如,如io_uring_setup(2)
中所述),則由他們提供額外的樣板來執行此操作並確保他們遵守所有預期的規則......而不是手動完成所有事情看起來更容易使用liburing ( io_uring
包裝庫)。
我不清楚你為什么選擇使用
#include <kernel/io_uring.h>
——這看起來不對。 我系統上的 header 是由
#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 和 io_uring PDF中所述,這只是通過直接系統調用使用io_uring
時的冰山一角。 io_uring 教程之王有一個名為The Low-level io_uring Interface的部分,它更詳細地描述了用法,但使用io_uring
看起來更容易也更安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.