2010-11-23 7 views
3

J'utilise libnetfilter_queue pour mon projet. De la file d'attente de l'application C est accessible par "descripteur de fichier de file d'attente". J'ai 5 files d'attente et 5 discussions pour les gérer. Ce que je veux accomplir est de réveiller le fil quand il y a exactement 2 paquets dans la file d'attente. Je suis venu avec l'idée d'utiliser la fonction select et le tableau d'ints indiquant combien de paquets ont été mis en file d'attente dans chaque file d'attente. Après avoir sélectionné exit avec le code> 0, je vérifie quelle file a reçu un paquet et une valeur d'incrémentation dans le tableau, si elle est plus grande que 2, je réveille un thread. Tout ira bien, mais select indique que la file d'attente a des données à lire jusqu'à ce que j'appelle recv et je ne peux pas le faire car un thread séparé devrait gérer ces paquets. Quelqu'un a une idée de comment résoudre ce problème? Je sais que je peux définir SO_RCVLOWAT mais cela ne résout pas mon problème, car je ne sais pas quelle taille seront ces 2 paquets.Comment réveiller un thread après avoir reçu 2 paquets

+0

Pourquoi auriez-vous besoin de quelque chose comme ça? – jalf

Répondre

3

Comme recommandé par Tobu, epoll est un meilleur choix et il fonctionne mieux que de sélectionner. Cependant, la plupart de ces fonctions d'interrogation indiquent qu'il existe un événement (données disponibles) sauf si quelqu'un lit. Si possible, utilisez le modèle suivant: Utilisez epoll/select pour voir si les données entrantes réveillent le thread de travail. Laissez le thread de travail décider quoi faire avec les données (un paquet, deux ou plus) avant de faire le travail. Un thread de lecture-N Worker threads: utilisera epoll pour attendre et lire toutes les données entrantes et les publier dans la file d'attente des threads de travail correspondants. Une fois que le # de paquet atteint le seuil, réveillez le thread de travail (en utilisant un sémaphore).

1

Vous êtes à la recherche de notifications d'événement déclenchées par un front - des notifications envoyées lorsque la quantité de données disponibles change. epoll fonctionne comme cela lorsque vous utilisez l'indicateur EPOLLET et, par défaut, réorganise la notification afin que vous continuiez à être averti des nouveaux paquets.

Veuillez noter que vous ne serez averti qu'une seule fois si plusieurs paquets arrivent entre deux appels epoll_wait.

+0

je vois votre point. Si j'ai passé trop de temps entre les appels epoll_wait, et que plus d'un paquet a été reçu pendant ce temps, je ne peux pas déterminer combien ont été reçus. Merci pour cette information – pejotr

+0

Est-ce vraiment quand la quantité de données disponibles change ou quand elle passe de vide à non vide (pour le tampon de réception)? –

+0

Je suis presque sûr que c'est le premier: chaque fois qu'un paquet arrive. Le code du noyau justs définit un drapeau quand ep_poll_callback est appelé et ne suit pas si le tampon était plein ou pas à ce moment-là. – Tobu