【问题标题】:there is a flaw in epoll_data structure , is it necessary to improve it?epoll_data 结构有缺陷,是否需要改进?
【发布时间】: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-&gt;fd。如果我把所有的事件都comsistent,即让它们都有一个void ptr,对于某些socket来说,这是一种浪费,因为它们与附加信息无关。

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

您对此有何看法?谢谢!

【问题讨论】:

  • 为什么检查不一致?当你已经拥有events[i].data.fd时,我不明白为什么你还需要使用events[i].data.ptr-&gt;fd

标签: sockets network-programming epoll


【解决方案1】:

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

在我看来,最小的操作系统界面更可取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多