在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;
但是,当我要检查 Activity 事件时,我必须执行以下操作:
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
。如果我将所有事件保持一致,即让所有事件都具有一个无效的ptr,那么对于某些套接字,这是浪费的,因为它们与其他信息无关。因此我认为epoll_data应该具有独立的
int fd
元素,因为fd
通常非常重要。您对此有何看法?谢谢!
最佳答案
您始终可以使用存储在epoll_data
实例中的文件描述符将索引/键索引到自己的数据数组/哈希中。或者,您始终可以使用该联合的指针成员,并将所有元数据保存在自定义数据结构中。换句话说,您已经可以使其一致。
我认为,最小的OS界面是可取的。
关于sockets - epoll_data结构存在缺陷,是否需要改进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16654598/