关于epoll_ctl()

时间:2012-02-17 09:28:27

标签: c sockets epoll

当使用epoll_ctl()时,我发现第三个参数“fd”是epoll文件描述符“epfd”之外的另一个文件描述符。我看到了这样一个例子:

event.data.fd = sfd; //sfd is a fd for listening
event.events = EPOLLIN | EPOLLET;
s = epoll_ctl (efd, EPOLL_CTL_ADD, sfd, &event);

正如我所看到的,event.data.fd中的文件描述符与epoll_ctl中的第三个参数相同,为什么需要两次传递这个描述符?有什么不同吗?

1 个答案:

答案 0 :(得分:12)

实际上,您没有来设置event.data.fd。这是一个联盟,你可以设置其他成员。当epoll_wait返回时,您将获得与变得有趣的描述符相关联的event.data

typedef union epoll_data {
    void    *ptr;
    int      fd;
    uint32_t u32;
    uint64_t u64;
} epoll_data_t;

这意味着您完全免费将任何内容放入fd并在ptr中添加内容(例如)。

总之,epoll_ctl不能依赖于您填充fd的事实,这就是为什么它有一个单独的显式参数。