我有一个kqueue看着一个项目:一个空的马赫端口集。 kevent64
表示没有可用的事件,select
表示kqueue尚未准备好阅读。但poll
表示kqueue 可读! - 虽然在随后调用kevent64
来阅读所谓的准备好的事件时似乎并非如此。
我正在使用的代码如下。您可以使用gcc -Wall -std=c99 -o test test.c
之类的内容构建它,然后使用./test
或其他任何内容运行它。它打印出来自kevent64
的返回值(尝试在不等待的情况下读取1后实际检索到的事件的数量),select
(在轮询后准备好读取的文件描述符的数量),以及{{1 (轮询后准备好读取的文件描述符的数量)。
我期望的输出会是这样的,表明poll
,kevent64
和select
都认为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