Структура Epoll epoll_data установлена, но позже возвращает неинициализированную

#c #linux #network-programming #epoll

Вопрос:

Я создаю события Epoll, устанавливаю индекс в структуре epoll пользовательских данных epoll_data и добавляю их в Epoll. Однако при получении вызова от Epoll этот индекс пользовательских данных неинициализирован.

Код:

 class Epoll
{
    Epoll()
    {
        _epollFd = epoll_create1(0);
        assert(_epollFd >= 0);
    }

    void addEvent()
    {
        struct epoll_event event;
        event.events = EPOLLIN;

        event.data.u32 = getIndexFromSomwhere();   // This is set with/prints 0

        int sock = getSockFromSomewhere();
        assert(epoll_ctl(_epollFd, EPOLL_CTL_ADD, sock, amp;event));
    }

    void receiveEvents()
    {
        while(true)
        {
            struct epoll_event events[MAX_SOCKETS];
            const size_t count = epoll_wait(_epollFd, amp;events[0], sizeof(events), -1);

            for(size_t j = 0; j < count;   j)
            {
                const uint32_t callbackIndex = events[j].data.u32;
                // This returns 32735, not 0 as expected
            }
        }
    }

    int _epollFd;
};
 

Комментарии:

1. 3-й параметр epoll_wait() ожидает количество элементов, а не количество байтов. Используйте MAX_SOCKETS вместо sizeof(events) . Кроме того, возвращаемое значение epoll_wait() является подписанным int , а не неподписанным size_t . таким образом, ваш цикл будет введен неправильно, если epoll_wait() вернется -1 при сбое.