有没有办法用kqueue / kevent模拟epoll_wait?

时间:2010-09-27 07:40:14

标签: linux freebsd epoll kqueue

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

有没有办法获得“准备好”的文件描述符列表,比如epoll_wait提供的?

2 个答案:

答案 0 :(得分:2)

发生的事件被放入传递给eventlist调用的kevent缓冲区中。因此,使此缓冲区足够大将为您提供所需的列表。回报 kevent来电的价值会告诉你有很多事件 在eventlist缓冲区中。

如果由于某种原因使用大缓冲区是不可行的, 你总是可以在零超时的情况下调用kevent 和一个较小的缓冲区,直到你在事件列表中得到零事件。

答案 1 :(得分:0)

提供更多背景......

使用kevent()的一个预期方案是将线程池调用。如果你有3个线程池都要求4个事件,那么操作系统希望能够按照它认为合适的方式汇集和分派实际事件。

如果7个事件可用,操作系统可能希望调度到3个线程,或者如果它认为它具有空核并且开销较少,则可能需要调度到所有3个线程。

我不是说你的情景完全无效;只是系统或多或少地设计用于保持信息远离你,所以它不会进入说'好,12个描述符准备好的情景。噢,嗯,我刚刚告诉你,但是在你有机会做任何事之前,其中有3个已经浮出水面。

Grrr几乎把这个场景钉了下来。您注册/注销您的描述符一次,当事件触发时,相关描述符将通过事件提供给您。