epoll:如何在使用具有许多fds的结构表时识别哪个fd已准备就绪

时间:2018-06-05 08:16:36

标签: c epoll

我有以下结构:

 DB::insert('call tblusers (?,?,@id)',array($req->email,Hash::make(($req->password))))

我有一系列这样的结构。

struct myfds_for_nic {
    int fd1;
    int fd2;
    int fd3;
    int fd4;
    int fd5;
    netinfo *nic_info;
};

每个结构有5个fds,我有1000个这样的条目。我想将所有这些fds添加到一个epoll实例中。由于struct myfds_for_nic nic_table[1000]; 的字段,我可以传递fd或指向我的数据的指针。我正在将指针传递给我的数据,如下所示

struct epoll_event event

在epoll_wait期间,当其中一个fds有一个事件时,我只会知道它是哪个条目但是如何找出条目下的哪个fd(5个fds中)实际上是可读/可写的?

1 个答案:

答案 0 :(得分:1)

事件允许传递自定义数据。您可以通过以下方式之一使用它:

1)在结构中传递FD成员的地址,然后使用指针算法确定地址所属的数组中的哪个结构以及哪个FD。通过在2 ^ n边界上对齐结构,您可以使用位移和掩码或此。

2)在单个int中编码FD的结构索引和索引,例如index * 5 + fd。从中获取索引和fd是微不足道的。

3)为您添加的每个FD分配额外的struct { struct myfds_for_nic * nic; int num_fd; },填写并将其用作事件的数据。

选项2可能是最容易理解的,而选项3是最通用的。