Группируйте несколько файловых дескрипторов в один "виртуальный" файловый дескриптор для экспорта FD через API.
Если подсистема имеет возможности обработки событий, то в мире Unix/Linux обычным явлением является добавление вызова API к этой подсистеме, чтобы позволить раскрыть файловый дескриптор, чтобы указанная обработка событий могла быть интегрирована в существующие основные циклы, которые используют что-то вроде опроса () или выберите (). Например, в Wayland есть wl_display_get_fd(). Если этот FD показывает активность, можно вызвать wl_display_read_events() и друзей.
Это работает тривиально, если внутренняя подсистема имеет ровно один FD. Но что, если есть несколько FD, за которыми нужно следить за событиями?
Я вижу только два решения:
- Выставить все ФД. Однако мне неизвестен какой-либо API, который бы это делал.
- Раскройте своего рода "виртуальный" FD, который каким-то образом связан с внутренними "реальными" FD. Как только реальный FD получает данные и помечается как доступный для чтения, виртуальный FD тоже. Как только в реальный FD можно записать, виртуальный FD автоматически помечается как доступный для записи и т. Д.
#2 для меня звучит чище. Возможно ли это? Или есть более эффективные способы справиться с этим?
1 ответ
Если вы конкретно работаете с Linux, то можете использовать этот механизм. Сначала вы создаете
epoll
пример с
int fd;
fd = epoll_create(1); // The argument is legacy and doesn't matter. It just has to be positive.
После этого вы можете добавить интересующие вас селекторы.
if ( epoll_ctl(fd, EPOLL_CTL_ADD, some_file_descriptor, NULL) != 0 ) {
// handle error
}
Этот последний аргумент может фактически содержать данные, которые вы хотите передать вам позже, когда один из ваших файловых дескрипторов будет готов. Подробности смотрите на справочной странице.
Вы можете узнать о любых готовых дескрипторах, используя
epoll_wait
или же
epoll_pwait
.