epoll_data结构存在缺陷,是否有必要对其进行改进?

时间:2013-05-20 17:08:01

标签: sockets network-programming epoll

在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。如果我把所有事件都设置得一致,即让所有事件都有一个void ptr,对于某些套接字来说,这是浪费,因为它们与其他信息无关。

所以我认为epoll_data应该有一个独立的int fd元素,因为fd通常非常重要。

您对此有何看法?谢谢!

1 个答案:

答案 0 :(得分:1)

您始终可以使用存储在epoll_data实例中的文件描述符来索引/键入您自己的数据数组/哈希。或者,您始终可以使用该联合的指针成员,并在自定义数据结构中包含所有元数据。换句话说,你已经可以使它保持一致。

在我看来,最小的OS界面是可取的。