2010-08-03 17 views

回答

1

可以用来获取EOL事件而忽略所有READ事件的技巧是为NOTE_LOWAT提供一个可笑的高值,从而抑制所有的READ事件。

这里有一个例子在Python REPL这样做:

Python 2.6.5 (r265:79063, Jul 17 2010, 22:57:01) 
[GCC 4.2.1 20070719 [FreeBSD]] on freebsd8 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import select 
>>> import socket 
>>> import sys 
>>> a, b = socket.socketpair() 
>>> kq = select.kqueue() 
>>> kq.control([select.kevent(a, select.KQ_FILTER_READ, select.KQ_EV_ADD, select.KQ_NOTE_LOWAT, sys.maxint)], 0) 
[] 
>>> b.send('abc') 
3 
>>> kq.control(None, 10) # Interrupt after some time. 
^CTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyboardInterrupt 
>>> b.close() 
>>> kq.control(None, 10) # Immediate return. 
[<select.kevent ident=3 filter=-1 flags=0x8000 fflags=0x0 data=0x3 udata=0x0>] 
>>> 

而且,有没有这样的事情在FreeBSD作为特殊的状态,引用man 2 select

唯一的例外情况 检测是在套接字上接收的带外数据 。

+0

如果要遍历kqueue对象,该怎么办? – solti 2013-08-28 17:00:44

+0

我有一个程序使用epoll,我试图转换为kqueue。我遇到了你的例子。我明白了大部分的部分,但当kq.control(无,10)时感到困惑。 – solti 2013-08-28 17:02:16

+0

changelist必须是kevent对象或None的迭代器。我可以说哪一个是可迭代的kevent对象? – solti 2013-08-28 17:06:06