о epoll_ctl () - PullRequest
       16

о epoll_ctl ()

7 голосов
/ 17 февраля 2012

при использовании epoll_ctl () я обнаружил, что третий параметр "fd" - это другой файловый дескриптор, кроме дескриптора файла epoll "epfd". И я видел пример, подобный этому:

event.data.fd = sfd; //sfd is a fd for listening
event.events = EPOLLIN | EPOLLET;
s = epoll_ctl (efd, EPOLL_CTL_ADD, sfd, &event);

Как я увидел, файловый дескриптор в event.data.fd совпадает с третьим параметром в epoll_ctl, зачем передавать этот дескриптор дважды? есть ли разница?

1 Ответ

12 голосов
/ 17 февраля 2012

На самом деле у вас нет для установки event.data.fd. Это союз, вы можете назначить других членов. Когда epoll_wait возвращается, вы получаете event.data, связанный с дескриптором, который стал интересным:

typedef union epoll_data {
    void    *ptr;
    int      fd;
    uint32_t u32;
    uint64_t u64;
} epoll_data_t;

Это означает, что вы совершенно свободны , а не , чтобы поместить что-либо в fd и вместо этого поместить что-то в ptr (например).

В заключение, epoll_ctl не может полагаться на тот факт, что вы заполните fd, поэтому он имеет отдельный явный параметр.

...