3

私は読んだことがありますが、ソケットのハングアップまたはソケットの例外的な状態について、またはman 2 kqueueに登録せずに通知を受け取る方法がわかりませんでした。これとは別に、kqueue がソケットの例外的な状態を完全に通知する方法は完全には明らかではありません。EVFILT_READEVFILT_WRITE

事前にご回答いただきありがとうございます。

4

1 に答える 1

1

すべてのREADイベントを無視してEOLイベントを取得するために使用できるトリックは、NOTE_LOWATに途方もなく高い値を提供して、すべてのREADイベントを抑制することです。

PythonREPLでこれを行う例を次に示します。

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 に答える