3
我读过man 2 kqueue
,但还没有发现如何在没有注册的情况下通知套接字挂断或套接字的异常情况EVFILT_READ
或EVFILT_WRITE
。除此之外,还不完全清楚kqueue如何表示插座的特殊状态。使用kqueue来确定套接字另一端的挂断或套接字的异常状态
感谢您提前回答。
我读过man 2 kqueue
,但还没有发现如何在没有注册的情况下通知套接字挂断或套接字的异常情况EVFILT_READ
或EVFILT_WRITE
。除此之外,还不完全清楚kqueue如何表示插座的特殊状态。使用kqueue来确定套接字另一端的挂断或套接字的异常状态
感谢您提前回答。
可以用来获取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
:
唯一的例外情况 检测是在套接字上接收的带外数据 。
如果要遍历kqueue对象,该怎么办? – solti 2013-08-28 17:00:44
我有一个程序使用epoll,我试图转换为kqueue。我遇到了你的例子。我明白了大部分的部分,但当kq.control(无,10)时感到困惑。 – solti 2013-08-28 17:02:16
changelist必须是kevent对象或None的迭代器。我可以说哪一个是可迭代的kevent对象? – solti 2013-08-28 17:06:06