为什么轮询表明观察单个空Mach端口集的kqueue是否可读?

时间:2015-10-14 02:24:13

标签: macos polling kqueue mach

我有一个kqueue看着一个项目:一个空的马赫端口集。 kevent64表示没有可用的事件,select表示kqueue尚未准备好阅读。但poll表示kqueue 可读! - 虽然在随后调用kevent64来阅读所谓的准备好的事件时似乎并非如此。

我正在使用的代码如下。您可以使用gcc -Wall -std=c99 -o test test.c之类的内容构建它,然后使用./test或其他任何内容运行它。它打印出来自kevent64的返回值(尝试在不等待的情况下读取1后实际检索到的事件的数量),select(在轮询后准备好读取的文件描述符的数量),以及{{1 (轮询后准备好读取的文件描述符的数量)。

我期望的输出会是这样的,表明pollkevent64select都认为kqueue是空的。

poll

但我实际得到的是这一点,表明$ ./kqueue_poll_machport kevent64: 0 select: 0 poll: 0 (revents: 0) kevent64: 0 kevent64说了一件事,而select说了另一件事 - 而且,即使在poll指出之后kqueue是可读的,poll仍然表示没有要读取的事件(这是第二次kevent64调用的原因。)

kevent64

$ ./kqueue_poll_machport kevent64: 0 select: 0 poll: 1 (revents: 1) kevent64: 0 的1值为revents,表示可以在不阻塞的情况下读取数据。如果我指定POLLIN和{{1},结果相同独立地。)

为何出现差异?

我的测试代码:

POLLRDNORM

0 个答案:

没有答案