关于epoll_ctl()
当使用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中的第三个参数相同,为什么需要两次传递这个描述符? 有什么区别吗?
实际上你不必设置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
的事实,这就是为什么它有一个单独的显式参数。