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 最通用。