epoll:如何在使用具有多个 fds 的 table 结构时识别哪个 fd 已准备就绪
epoll: How to identify which fd is ready when using a table of structures having many fds
我有以下结构:
struct myfds_for_nic {
int fd1;
int fd2;
int fd3;
int fd4;
int fd5;
netinfo *nic_info;
};
我有一个这样的结构数组。
struct myfds_for_nic nic_table[1000];
每个结构有5个fds,我有1000个这样的条目。我想将所有这些 fds 添加到一个 epoll 实例中。由于 struct epoll_event event
的字段,我可以传递一个 fd 或一个指向我的数据的指针。我正在传递指向我的数据的指针,如下所示
event.data.ptr = entry;
event.events = EPOLLIN;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, entry->fd3, &event);
在epoll_wait期间,当其中一个fd发生事件时,我只会知道它是哪个条目,但如何找出该条目下的哪个fd(共5个fd)实际上是readable/writable?
事件允许传递自定义数据。您可以通过以下方式之一使用它:
1) 传入struct中fd成员的地址,然后用指针算法算出这个地址属于你数组中的哪个结构体,属于哪个fd。通过在 2^n 边界上对齐结构,您可以使用位移和掩码或这个。
2) 将结构的索引和FD的索引编码在一个int中,例如索引 * 5 + fd。从中获取索引和 fd 是微不足道的。
3) 为您添加的每个 FD 分配一个额外的 struct { struct myfds_for_nic * nic; int num_fd; }
,填写它并将其地址用作事件的数据。
选项 2 可能最容易理解,而选项 3 最通用。
我有以下结构:
struct myfds_for_nic {
int fd1;
int fd2;
int fd3;
int fd4;
int fd5;
netinfo *nic_info;
};
我有一个这样的结构数组。
struct myfds_for_nic nic_table[1000];
每个结构有5个fds,我有1000个这样的条目。我想将所有这些 fds 添加到一个 epoll 实例中。由于 struct epoll_event event
的字段,我可以传递一个 fd 或一个指向我的数据的指针。我正在传递指向我的数据的指针,如下所示
event.data.ptr = entry;
event.events = EPOLLIN;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, entry->fd3, &event);
在epoll_wait期间,当其中一个fd发生事件时,我只会知道它是哪个条目,但如何找出该条目下的哪个fd(共5个fd)实际上是readable/writable?
事件允许传递自定义数据。您可以通过以下方式之一使用它:
1) 传入struct中fd成员的地址,然后用指针算法算出这个地址属于你数组中的哪个结构体,属于哪个fd。通过在 2^n 边界上对齐结构,您可以使用位移和掩码或这个。
2) 将结构的索引和FD的索引编码在一个int中,例如索引 * 5 + fd。从中获取索引和 fd 是微不足道的。
3) 为您添加的每个 FD 分配一个额外的 struct { struct myfds_for_nic * nic; int num_fd; }
,填写它并将其地址用作事件的数据。
选项 2 可能最容易理解,而选项 3 最通用。