2013-05-20 1 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. Если я поставил все события совместимыми, а именно, пусть у всех из них есть пустота ptr, для некоторых сокетов это отходы, потому что они не связаны с дополнительной информацией.

поэтому я думаю, что epoll_data должен иметь независимый элемент int fd, потому что fd обычно очень важен.

Каково ваше мнение об этом? благодаря!

+2

* Почему * Неверная проверка? Я не понимаю, почему вам когда-либо нужно использовать 'events [i] .data.ptr-> fd', когда у вас уже есть' events [i] .data.fd' – EJP

ответ

1

Вы всегда можете использовать дескриптор файла, хранящийся в экземпляре epoll_data, чтобы индексировать/ключ в свой собственный массив данных/хэш. Или вы всегда можете использовать элемент указателя этого союза и иметь все свои метаданные в своей настраиваемой структуре данных. Другими словами, вы уже можете сделать это согласованным.

На мой взгляд, минимальный интерфейс ОС является предпочтительным.