epoll: как определить, какой fd готов при использовании таблицы структур, имеющих много fd - PullRequest
0 голосов
/ 05 июня 2018

У меня следующая структура:

struct myfds_for_nic {
    int fd1;
    int fd2;
    int fd3;
    int fd4;
    int fd5;
    netinfo *nic_info;
};

У меня есть массив таких структур.

struct myfds_for_nic nic_table[1000];

Каждая структура имеет 5 fds, и у меня есть 1000 таких записей.Я хочу добавить все эти FDS в один экземпляр epoll.Из-за полей struct epoll_event event я могу передать fd или указатель на мои данные.Я передаю указатель на мои данные, как показано нижеиз 5 фдс) под записью реально читаемо / доступно для записи?

1 Ответ

0 голосов
/ 05 июня 2018

Событие позволяет передавать пользовательские данные.Вы можете использовать это одним из следующих способов:

1) передать адрес члена FD в структуре и затем использовать арифметику указателя, чтобы выяснить, какой структуре в вашем массиве принадлежит адрес и какой FD.Выравнивая структуру по границе 2 ^ n, вы можете использовать битовые сдвиги и маски, или это.

2) Кодировать индекс структуры и индекс FD в одном int, например index * 5 + fd,Получение индекса и fd из этого тривиально.

3) Выделите дополнительные struct { struct myfds_for_nic * nic; int num_fd; } для каждого добавляемого вами FD, заполните его и используйте его адрес в качестве данных для события.

Вариант 2 может быть самым простым для понимания, тогда как вариант 3 является наиболее общим.

...