Comment lire les descripteurs de fichiers multiples en utilisant epoll_select avec EPOLLET?

StackOverflow https://stackoverflow.com/questions/4003804

  •  25-09-2019
  •  | 
  •  

Question

man epoll:

The suggested way to use epoll as an edge-triggered (EPOLLET) interface is as follows:
    i   with nonblocking file descriptors; and
    ii  by waiting for an event only after read(2) or write(2) return EAGAIN.

Imaginez que nous avons deux fds:. La première est passive, les données disponibles ne parfois, le second est actif, les données ne sont pas disponibles parfois

epoll_wait est revenu que l'on peut lire à la fois. Nous lisons {le premier, que le second} dans une boucle (sans appel à epoll_wait à cause de cela peut bloquer soudainement alors que les données sont encore disponibles).

Maintenant, le premier descripteur de fichier renvoyé EAGAIN sur lecture.

Que faire?

  1. Si nous allons à la lecture de la deuxième fd dans une boucle (sans appel à epoll_wait), nous pouvons manquer que les données sont devenues disponibles sur la première fd. Il va juste lire et lire et lire sans EAGAIN.
  2. Si nous « consulter » epoll_wait avant chaque lecture de la seconde fd, epoll_wait peut bloquer SOUDAIN à cause de rien changé de l'appel précédent (données toujours pas disponibles sur la première FD et toujours disponible sur la deuxième FD).

Comment poursuivre le traitement de la deuxième FD, mais sans oublier le premier FD?

Mise à jour: Trouver une chose: l'homme epoll_wait:

while specifying timeout equal to zero makes epoll_wait() to return immediately even if no events are available

Avec ce que je peux énumérer les événements pour IFD, même s'il n'y a aucun événement.

Était-ce utile?

La solution

Si FD2 est constamment lisible que vous pourriez considérer que epoll ne convient pas à elle. Il pourrait être utile de tourner un fil juste pour asseoir et lire.

Dans le cas contraire, lisez FD2 dans une boucle jusqu'à ce qu'il soit vidé, mais dans la boucle, il a essayer de lire FD1 une fois tous les X fois par. Si FD1 contient des données, lire. Sinon, vous aurez juste EAGAIN, remettre le compteur X et revenir à la lecture FD2. Lorsque les deux sont drainées vous êtes de retour à epoll_wait.

Quelque chose comme:

count = 1;

while (true)
{
   read fd2;

   if (EAGAIN)
       break;
   else
       process data;

   count--;

   if (! count)
   {  
       while (true)
       {
           read fd1;

           if (EAGAIN)
               count = 10;
               break;
           else
               process data;
       }
   }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top