0

我有一堆文件描述符的列表,我已经为其创建了 kevents,我试图弄清楚是否有任何方法可以获得准备好进行读取或写入访问的文件描述符的数量。

有什么方法可以获取“就绪”文件描述符列表,就像 epoll_wait 提供的那样?

4

2 回答 2

2

Events that occurred are placed into the eventlist buffer passed to the kevent call. So making this buffer sufficiently large will give you the list you are seeking. The return value of the kevent call will tell you have many events are in the eventlist buffer.

If using a large buffer is not feasible for some reason, you can always do a loop calling kevent with a zero timeout and a smaller buffer, until you get zero events in the eventlist.

于 2010-09-27T09:51:56.033 回答
0

为了提供更多的上下文......

kevent() 的预期场景之一是您将对它进行线程池调用。如果您有 3 个线程池都要求 4 个事件,那么操作系统希望能够在它认为合适的时候汇集和调度实际事件。

如果有 7 个事件可用,则操作系统可能希望分派到 3 个线程,或者如果它认为它有空内核且开销较小,它可能希望分派到所有 3 个线程。

我并不是说您的方案根本无效;只是该系统或多或少地旨在使该信息远离您,因此它不会进入说“好吧,12个描述符已准备好”的情况。哦,嗯,​​我刚刚告诉过你,但是其中 3 个在你有机会做任何事情之前就已经浮出水面了。”

Grrr 几乎确定了这个场景。您注册/注销一次描述符,当事件触发时,相关描述符将随事件一起提供给您。

于 2012-03-04T20:51:21.533 回答