【发布时间】:2013-05-20 17:08:00
【问题描述】:
在epoll上,epoll_data结构很重要
typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
如果对于某些事件,我需要将其与一些附加信息相关联,对于 epoll_data,我需要构造一个结构并使用ptr 指向该结构。在结构内部我放了一个fd 元素,类似于
typedef {
int fd;
char* info;
} compound;
但是当我想检查活动事件时,我必须执行以下操作:
for( ; ; )
{
nfds = epoll_wait(epfd,events,20,500);
for(i=0;i<nfds;++i)
{
if(events[i].data.fd==listenfd) {
...
}
else if( ((compound*)events[i].events.ptr)->fd ....){
...
}
}
检查不一致,有时需要检查events[i].data.fd,有时需要检查events[i].data.ptr->fd。如果我把所有的事件都comsistent,即让它们都有一个void ptr,对于某些socket来说,这是一种浪费,因为它们与附加信息无关。
所以我认为 epoll_data 应该有一个独立的int fd 元素,因为fd 通常非常重要。
您对此有何看法?谢谢!
【问题讨论】:
-
为什么检查不一致?当你已经拥有
events[i].data.fd时,我不明白为什么你还需要使用events[i].data.ptr->fd
标签: sockets network-programming epoll