Группируйте несколько файловых дескрипторов в один "виртуальный" файловый дескриптор для экспорта FD через API.

Если подсистема имеет возможности обработки событий, то в мире Unix/Linux обычным явлением является добавление вызова API к этой подсистеме, чтобы позволить раскрыть файловый дескриптор, чтобы указанная обработка событий могла быть интегрирована в существующие основные циклы, которые используют что-то вроде опроса () или выберите (). Например, в Wayland есть wl_display_get_fd(). Если этот FD показывает активность, можно вызвать wl_display_read_events() и друзей.

Это работает тривиально, если внутренняя подсистема имеет ровно один FD. Но что, если есть несколько FD, за которыми нужно следить за событиями?

Я вижу только два решения:

  1. Выставить все ФД. Однако мне неизвестен какой-либо API, который бы это делал.
  2. Раскройте своего рода "виртуальный" 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.

Другие вопросы по тегам