关于epoll_ctl()

rea*_*jin 9 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);
Run Code Online (Sandbox Code Playgroud)

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

cni*_*tar 15

实际上你没必要设置event.data.fd.这是一个联盟,你可以设置其他成员.当epoll_wait你得到的回报event.data与成为有趣的描述符相关:

typedef union epoll_data {
    void    *ptr;
    int      fd;
    uint32_t u32;
    uint64_t u64;
} epoll_data_t;
Run Code Online (Sandbox Code Playgroud)

这意味着你完全免费把任何东西fd,把东西ptr代替(例如).

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

  • 我实际上已经看到很多代码将fd放在epoll_data结构中,只是将fd用作表的索引,该表保存指向与该套接字关联的应用程序结构的指针 - 一个也包含fd的结构.显然,他们没有意识到他们可以使用`ptr`成员而不是`fd`并保存查找. (4认同)
  • 好的,我明白了 - epoll_data中的fd并不是由系统使用,而是由我自己使用. (4认同)
  • 您传递给epoll_ctl的fd是您希望为其获取事件的文件描述符。“ event.data”中的“ fd”仅供您使用-系统会忽略它,您可以将其用于任何目的。 (2认同)