e.data.fd = cfd;
e.data.ptr = (void*)cfd;
epoll_data -- это union, не нужно его инициализировать сначала одним, а потом другим:
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
в документации сказано, что там должен быть дескриптор серверного сокета
в документации сказано, что там должно быть значение, которое было в поле data во время вызова epoll_ctl.
Кроме того, 0 -- вполне нормальный файловый дескриптор.
Короче, я попробовал, у меня работает. Если у тебя не работает -- приведи весь код.