2017-01-09 1 views
1

Je pense que la question n'est pas nouvelle: j'ai un thread qui devrait lire à partir d'un serveur X (via XCB) et un autre serveur connecté avec TCP, donc l'appel select est nécessaire. Ce qui m'embrouille, c'est quand le programme revient de select, il y a des données dans le lien du serveur X, et si les données ne sont pas suffisantes pour un événement XCB? Dans ce cas, xcb_poll_for_event() devrait retourner NULL, mais quand le programme appelle à nouveau select, il ne bloque pas car il y a des données après tout, donc le programme est bloqué dans l'état d'attente "busy".La façon sûre d'avoir select et xcb_poll_for_event fonctionne-t-elle ensemble?

Est-ce une préoccupation légitime? Je crois parce que chaque événement XCB est composé de nombreux octets et le serveur peut être interrompu lors de l'envoi.

Répondre

0

Comment sur la définition du SO_RCVLOWAT pour le fd XCB avec la taille requise d'un événement XCB à l'aide setsockopt(). Maintenant, le descripteur de fichier de socket ne sélectionnera comme lisible que s'il y a au moins cette quantité de données à lire. C'est une approche normale que nous avons utilisée en traitant des serveurs de TCP, n'ai pas essayé ceci avec des fd de XCB cependant.

+0

Merci. Je ne connaissais pas cette option auparavant, mais ici je ne peux pas prédire combien d'octets sont nécessaires pour un événement XCB. Selon http://man7.org/linux/man-pages/man7/socket.7.html, semble que cette option ne fonctionne pas comme prévu? "Les appels système select (2) et poll (2) ne respectent pas le paramètre SO_RCVLOWAT sous Linux, et marquent un socket lisible quand même un seul octet de données est disponible.Une lecture ultérieure de la socket se bloquera jusqu'à SO_RCVLOWAT les octets sont disponibles. " – Danath