Можно ли опросить файловый дескриптор kqueue с помощью `select()`?

Когда вы создаете kqueue с помощью kqueue(), вы возвращаете дескриптор файла. Но похоже, что этот дескриптор файла не может быть осмысленно опрошен с помощью select(). Я понимаю, что стандартный способ опроса/чтения из kqueue() — это kevent(...), но я пытаюсь интегрироваться с некоторым устаревшим кодом, который опрашивает файловые дескрипторы, используя select().

Цель здесь заключалась в том, чтобы иметь возможность запускать «пользовательское событие», которое может быть обнаружено этим механизмом опроса на основе select (даже если событие в конечном итоге необходимо «использовать» с использованием kevent() позже). Это выглядело так, как будто EVFILT_USER был рожден для этого, но быстрый эксперимент показывает, что select() не сообщает о том, что fd kqueue готов к чтению, когда событие добавляется (и запускается) в kqueue, оно просто истекает по тайм-ауту ( или блокирует навсегда). (Но эквивалентный вызов kevent() действительно видит/возвращает событие.)

Я делаю что-то неправильно? Или просто невозможно опросить fd kqueue с помощью select()?


person ipmcc    schedule 18.06.2015    source источник


Ответы (1)


В документе, описывающем kqueue/kevent, говорится (раздел 6.5):

Поскольку обычный файловый дескриптор ссылается на kqueue, он может участвовать в любых операциях, которые обычно могут выполняться с дескриптором. Приложение может select(), poll(), close() или даже создать kevent, ссылающийся на kqueue;

Это действительно так для FreeBSD, я проверил это с помощью следующего кода:

  struct kevent e;
  fd_set fdset;
  int kq=kqueue();

  EV_SET(&e, 1, EVFILT_USER, EV_ADD, 0, 0, NULL);
  kevent(kq, &e, 1, 0, 0, 0); // register USER event filter

  EV_SET(&e, 1, EVFILT_USER, EV_ADD, NOTE_TRIGGER, 0, NULL);
  kevent(kq, &e, 1, 0, 0, 0); // trigger USER event

  FD_ZERO(&fdset);
  FD_SET(kq,&fdset);

  select(FD_SETSIZE,&fdset, 0, 0, 0); // wait for activity on kq

  int res = kevent(kq, 0, 0, &e, 1, 0); // get the event
person arrowd    schedule 03.09.2015