2013-05-20 41 views
2

上的epoll,該epoll_data結構是很重要的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通常非常重要。

您對此有何看法?謝謝!

+2

*爲什麼*檢查不一致?當你已經有'events [i] .data.fd'時,我不明白你爲什麼需要使用'events [i] .data.ptr-> fd' – EJP

回答

1

您可以隨時使用存儲在epoll_data實例中的文件描述符將索引/鍵值編入您自己的數據數組/散列中。或者,您始終可以使用該聯合的指針成員,並將所有元數據都包含在自定義數據結構中。換句話說,你已經可以使其一致。

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

相關問題