Using linux epoll: epoll_ctl 好像有冗余参数?

Using linux epoll: epoll_ctl seems to have redundant parameter?

通常在linux我们想使用epoll时,首先创建一个epfd,然后将fd和events注册到它里面。

 int fd=open(...)
 int epfd=epoll_create(1);
 epoll_event ev,events[1];
 ev.data.fd=fd;//already registered
 ev.events=EPOLLIN|EPOLLET;
 epoll_ctl(epfd,EPOLL_CTL_ADD,fd,&ev);//still need to specify fd?

以上是我从网上找的一个常见的例子。它有效,但问题是:

  1. ev.data.fd=fd here I already have my "fd" assigned to ev structure.

  2. epoll_ctl still requires the 3rd parameter of this fd.

而epoll_ctl的第4个参数已经包含了这个fd的信息。这就是为什么我认为它是多余的。

有什么解释吗?

你的ev.data是一个工会。您 可以 使用 fd 成员,但您不必这样做。您还可以在其中粘贴其他数据。

ev.data 的重点当然是 是你在事件触发时得到的数据,所以你需要一些方法将它与原始文件描述符。将该文件描述符写入 fd 变体是实现该目标的一种简单方法,但还存在其他解决方案。

一个流行的例子是定义一个抽象的 class Fd,从它派生具体的 类 用于特定目的,然后将转换为 void* 的向上转换基指针写入 ev.data.ptr。收到事件后,您将 ev.data.ptr 转换回 Fd* 并调用合适的虚拟成员函数来处理该事件。

"When fd is ready, return ev. You don't have to set ev.fd to fd." 我不知道为什么手册页不这样写,这样更容易理解。