[英]io_uring_enter syscall: bad file descriptor
我想使用io_uring_enter
向环发送请求,但是由于文件描述符错误,系统调用失败。 我仔细检查了是否使用了正确的 fd。
#define _GNU_SOURCE
#include <stdio.h>
#include <liburing.h>
#include <pthread.h>
#include <string.h>
#define __NR_io_uring_setup 425
#define __NR_io_uring_enter 426
#define __NR_io_uring_register 427
#define QUEUE_DEPTH 2
#define REQ_F_FORCE_ASYNC 16
int uring_setup(unsigned int entries, unsigned int flags) {
struct io_uring_params p;
memset(&p, 0, sizeof(p));
p.flags = flags;
return syscall(__NR_io_uring_setup, entries, &p);
}
int uring_enter(int f, unsigned int n_queues, unsigned int flags) {
return syscall(__NR_io_uring_enter, f, n_queues, 0, IORING_ENTER_GETEVENTS|flags, NULL);
}
int main() {
pthread_t thrd;
int fd = uring_setup(QUEUE_DEPTH, IORING_SETUP_IOPOLL);
printf("fd: %d\n", fd);
printf("uring_enter: %d\n", uring_enter(fd, 2, REQ_F_FORCE_ASYNC));
return 0;
}
output:
fd: 3
uring_enter: -1
strace 说: io_uring_enter(3, 2, 0, IORING_ENTER_GETEVENTS|0x10, NULL, 68719476736) = -1 EBADF (Bad file descriptor)
有人可以帮忙吗?
您将REQ_F_FORCE_ASYNC
(即 16)作为标志传递给io_uring_enter
,不幸的是,这是IORING_ENTER_REGISTERED_RING
的值,用于先前注册的环。
在这种情况下, kernel 将其视为环偏移量而不是 fd ,并且由于您没有注册这样的环,因此返回EBADF
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.