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?
以上是我从网上找的一个常见的例子。它有效,但问题是:
ev.data.fd=fd here I already have my "fd" assigned to ev structure.
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."
我不知道为什么手册页不这样写,这样更容易理解。
通常在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?
以上是我从网上找的一个常见的例子。它有效,但问题是:
ev.data.fd=fd here I already have my "fd" assigned to ev structure.
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." 我不知道为什么手册页不这样写,这样更容易理解。