2010-08-03 9 views
3

man 2 kqueue을 읽었으나 소켓을 끊거나 소켓의 예외 조건을 등록하지 않고 통지받을 수있는 방법을 찾지 못했습니다. EVFILT_READ 또는 EVFILT_WRITE입니다. 이 외에도 kqueue가 예외적으로 소켓의 상태를 어떻게 표시하는지 완전히 명확하지 않습니다.kqueue를 사용하여 소켓의 다른 쪽에서 hangup을 확인하거나 예외적 인 소켓 상태를 확인하십시오.

미리 답변 해 주셔서 감사합니다.

답변

1

모든 READ 이벤트를 무시하면서 EOL 이벤트를 얻는 데 사용할 수있는 트릭은 NOTE_LOWAT에 엄청나게 높은 값을 제공하여 모든 READ 이벤트를 억제하는 것입니다. ,

또한
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 인용 :

유일한 예외 조건 감지를

여기 예를 들어 파이썬 REPL에서 이렇게이다 소켓에서받은 대역 외 데이터 입니다.

+0

kqueue 개체를 반복 할 경우 어떻게해야합니까? – solti

+0

나는 epoll을 사용하는 프로그램을 가지고 있으며 kqueue로 변환하려고합니다. 나는 당신의 모범을 보았습니다. 나는 대부분을 이해했지만 kq.control (None, 10)이 혼란스러워졌습니다. – solti

+0

변경 목록은 kevent 객체의 반복 가능 또는 없음이어야합니다. 내가 말할 수있는 것은 반복 가능한 kevent 객체이다. – solti