/ / Použiť kqueue na určenie zavesenia na druhej strane zásuvky alebo výnimočný stav soketu - sieťovanie, bsd, kqueue

Použite kqueue na určenie zavesenia na druhej strane zásuvky alebo výnimočný stav soketu - sieťovanie, bsd, kqueue

Čítal som man 2 kqueue ale nenašli som, ako môžem dostať upozornenie o zámku soketu alebo o výnimočnom stave zásuvky bez toho, aby som ju zaregistroval EVFILT_READ alebo EVFILT_WRITE, Okrem toho nie je úplne jasné, ako kqueue signalizuje výnimočné stavy zásuviek úplne.

Ďakujeme za vašu odpoveď vopred.

odpovede:

1 pre odpoveď č. 1

Trik, ktorý môže byť použitý na získanie udalostí EOL pri ignorovaní všetkých udalostí READ, je poskytnúť NOTE_LOWATu nesmyslne vysokú hodnotu, čím potlačí všetky udalosti READ.

Tu je príklad, ktorý robí v Pythone 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>]
>>>

Navyše na FreeBSD neexistuje taká vec ako výnimočný stav, citovať man 2 select:

Jediná mimoriadna podmienka zistiteľné sú údaje mimo pásma prijaté v zásuvke.