2017-01-09 3 views
1

Ich denke, die Frage ist nicht neu: Ich habe einen Thread, der von einem X-Server (via XCB) und einem anderen mit TCP verbundenen Server lesen sollte, so dass Select aufgerufen werden muss.Der sichere Weg, um auszuwählen und xcb_poll_for_event zusammenarbeiten?

Was mich verwirrend ist, wenn das Programm von Auswahl zurückkehrt, stellt sich heraus, gibt es Daten in der X-Server-Link, was ist, wenn die Daten nicht genug für ein XCB-Ereignis ist? In diesem Fall sollte xcb_poll_for_event() NULL zurückgeben, aber wenn das Programm erneut auswählt, blockiert es nicht, weil es überhaupt Daten gibt, so dass das Programm im Wartezustand "beschäftigt" gefangen ist.

Ist das ein berechtigtes Problem? Ich glaube das, weil jedes XCB-Ereignis aus vielen Bytes besteht und der Server beim Senden unterbrochen werden kann.

Antwort

0

Wie über die SO_RCVLOWAT für die xcb fd mit der erforderlichen Größe eines XCB Ereignis mit setsockopt() Einstellung. Nun wird der Dateideskriptor des Sockets nur dann als lesbar ausgewählt, wenn mindestens diese Datenmenge zum Lesen gelesen wird. Dies ist der normale Ansatz, den wir beim Umgang mit TCP-Servern verwendet haben, habe dies jedoch nicht mit XCB-fds versucht.

+0

Danke. Ich kannte diese Option vorher nicht, aber hier kann ich nicht vorhersagen, wie viele Bytes für ein XCB-Ereignis benötigt werden. Laut http://man7.org/linux/man-pages/man7/socket.7.html scheint diese Option nicht wie erwartet zu funktionieren? "Die Systemaufrufe select (2) und poll (2) berücksichtigen derzeit nicht die Einstellung SO_RCVLOWAT unter Linux und markieren einen Socket, der lesbar ist, wenn nur ein einzelnes Datenbyte verfügbar ist. Ein nachfolgendes Lesen aus dem Socket wird bis SO_RCVLOWAT blockiert Bytes sind verfügbar. " – Danath

Verwandte Themen