繁体   English   中英

io_uring_enter 系统调用:错误的文件描述符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM