2010-09-27 3 views
0

У меня есть список кучи файловых дескрипторов, для которых я создал kevents, и я пытаюсь выяснить, есть ли способ получить число из них, которые готовы для чтения или записи.Есть ли способ эмулировать epoll_wait с kqueue/kevent?

Есть ли способ получить список «готовых» файловых дескрипторов, например, что предлагает epoll_wait?

ответ

2

События, которые произошли, помещаются в буфер eventlist, переданный по вызову kevent. Поэтому, делая этот буфер достаточно большим, вы получите список, который ищете. Возврат значение звонка kevent скажет, что у вас много событий находятся в буфере eventlist.

При использовании большого буфера не представляется возможным по каким-то причинам, вы всегда можете сделать петлю, призывающую kevent с нулевой тайм-аут и меньший буфер, пока вы не получите ноль событий в EventList.

+0

Не нужно ли передавать дескриптор файла с помощью вызова kevent? Думаю, мне нужно будет поиграть с этим еще немного. – clee

+0

Вы используете призыв «kevent» как для регистрации вашего интереса к событиям определенного типа, так и для получения событий, которые на самом деле происходят. Вы можете объединить его в один звонок, но вам этого не нужно. Когда вы зарегистрируете интерес к файловому дескриптору, 'kevent' сообщит соответствующие события для этого дескриптора, если вы не использовали' EV_ONESHOT', или не удалили событие, или не закрыли дескриптор. – Grrrr

0

Чтобы дать немного больше контекста ...

Одним из ожидаемых сценариев с KEVENT() является то, что вы пул потоков вызовов к нему. Если у вас было 3 пула потоков, которые запрашивали 4 события, ОС хотела бы иметь возможность собирать и отправлять фактические события по своему усмотрению.

Если доступно 7 событий, ОС может захотеть отправить 3 потокам, или, возможно, захочет отправить все 3 потока, если будет считаться, что у них пустые ядра и меньше накладных расходов.

Я не говорю, что ваш сценарий недействителен вообще; просто для того, чтобы система была более или менее сконструирована так, чтобы держать эту информацию от вас, чтобы она не попадала в сценарии «хорошо, 12 дескрипторов готовы. О, хм, я просто сказал вам, что, но 3 из них всплыли, прежде чем у вас была возможность сделать что-нибудь ».

Grrr в значительной степени прибил сценарий. Вы регистрируете/дешифруете свои дескрипторы один раз, и соответствующий дескриптор будет предоставлен вам с событием, когда событие срабатывает.