3

我已阅读man 2 kqueue但尚未发现如何在不使用 or 注册的情况下获得有关套接字挂断或套接字异常情况的EVFILT_READ通知EVFILT_WRITE。除此之外,不完全清楚 kqueue 如何完全发出套接字异常状态的信号。

提前感谢您的回答。

4

1 回答 1

1

一个可以用来在忽略所有 READ 事件的同时获取 EOL 事件的技巧是向 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

唯一可检测的异常情况是在套接字上接收到的带外数据。

于 2010-08-03T01:56:36.987 回答