utilisation de select() / fd_set() et autres joyeusetés sous linux

utilisation de select() / fd_set() et autres joyeusetés sous linux - C++ - Programmation

Marsh Posté le 06-04-2013 à 21:17:07    

Salut les pros !
 
J'ai en quelques sortes un soucis algorithmique.
 
en gros, dans un thread, j'ai une map<FD, evenement> ;
 
Je fais un select() bloquant sur un fd_set contenant lesdits FDs en lecture (rien pour ecriture et exception):
 
res = select(nfds +1, &monFdset, NULL,NULL,NULL);
 
Et derriere j'ai une méthode TraiteEvenement(evenement).
 
Mon soucis c'est que la seule chose que je connaisse pour traiter des fd_set, c'est la macro FD_ISSET(fd, fdset) qui me dit si oui ou non le fd passé en parametre est dans fdset. Et j'aimerai éviter d'itérer a travers chaque evenement de ma map pour trouver les seuls qui sont déclenchés...
 
j'aimerai en gros faire :

Code :
  1. for (int i = 0 ; i<res; i++)
  2. {
  3. TraiteEvenement(maMap[monFdset[i]]);
  4. }


 
et pas :
 

Code :
  1. for (int i = 0; i <maMap.size();i++)
  2. {
  3. if (FD_ISSET(i,monFdSet)
  4. {
  5. TraiteEvenement(maMap[i]);
  6. }
  7. }


 
Mais apparamment c'est pas aussi simple que ca ...
 
Y'a un bon connaisseur de fd_set dans la salle ?
 
merci d'avance :jap:

Reply

Marsh Posté le 06-04-2013 à 21:17:07   

Reply

Marsh Posté le 06-04-2013 à 21:40:35    

Bonjour !
 
Pour utiliser régulièrement select, et donc les macros FD_ associées,  
non, il n'y a pas d'autres moyens.  
 
Mais est-ce vraiment un problème ?  
 
Par ailleurs, le code dans votre deuxième exemple est incorrect, vous devez utiliser un itérateur (même si j'imagine que c'est pour l'illustration que vous le donnez :) )
 
Bonne continuation !

Reply

Marsh Posté le 06-04-2013 à 22:21:33    

Merci pour l'info, meme si elle ne m'arrange pas :/
 
 
Pour ce qui est de la map, normalement pas besoin d'iterator, la clé de la map est le FD associé a l'évènement, et map a operator[] défini; normalement maMap[monFD] devrait me retourner l'évenement que je voulais associer à mon Fd ;)
 

Reply

Marsh Posté le 07-04-2013 à 10:00:33    

si tu travailles en C++, je te conseille plutot de jeter un oiel a Boost.ASIO qui fait ca proprement et utilise le bon modele de prog (a savoir celui d'agent evenementiel)

Reply

Marsh Posté le 07-04-2013 à 22:43:29    

Pas de boost dans mes programmes, c'est impossible a maintenir :/
 

Reply

Marsh Posté le 08-04-2013 à 15:50:06    

je rofl un peu mais passons

Reply

Marsh Posté le 09-04-2013 à 10:53:21    

+1 pour boost asio.
Mieux vaut utiliser une lib largement éprouvée et prévue pour ce que tu veux faire, plutot que de tenter de la reinventer.
Au final, tu vas pondre beaucoup plus de lignes de codes, qui elles pour le coup seront bien plus pénibles à maintenir  [:spamafote]


---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 09-04-2013 à 11:11:11    

in before "j'arrive pas l'installer"

Reply

Marsh Posté le 10-04-2013 à 09:58:17    

<avocat du diable>
Si suffisament de gens se plaignent de ce qu'ils n'arrivent pas à comprendre comment installer/utiliser boost, c'est pas un problème d'utilisateur, c'est un problème de doc.
</avocat du diable>

Reply

Marsh Posté le 10-04-2013 à 11:15:59    

la doc d'ASIO fait partie des plus fournies par contre.
Ensuite, le Getting Started est quand meme bien foutu.
 
Le probleme c'est les gens habitues au cliquodrome

Reply

Marsh Posté le 10-04-2013 à 11:15:59   

Reply

Marsh Posté le 10-04-2013 à 11:38:02    

snafu8 a écrit :

<avocat du diable>
Si suffisament de gens se plaignent de ce qu'ils n'arrivent pas à comprendre comment installer/utiliser boost, c'est pas un problème d'utilisateur, c'est un problème de doc.
</avocat du diable>


Je me suis mis au C++ il y a 2 ou 3 mois. Sur windows avec mingw32 au lieu de visual studio : boost n'est pas la lib qui m'a posé le plus de problèmes  :o  
Ne serait-ce que pour program_options, Boost poutre.


---------------
Main/Alt1/Alt2/Alt3
Reply

Marsh Posté le 10-04-2013 à 11:47:37    

@JoelF : je suis pas franchement convaincu que tu sois le plus a meme de juger de l'accessibilité d'un getting started.
@Volkhen, soit, mais ton exemple personnel reste un exemple particulier. Tout ce que je dis c'est que si un nombre significatif d'utilisateurs galèrent avec l'installation ou la configuration de boost, le problème est avant tout un problème de doc et de pédagogie.

Reply

Marsh Posté le 10-04-2013 à 18:34:37    

Non mais bon, un petit truc du genre "apt-get install libboost-dev" et c'est fini quoi  [:mlc]
Après si vous faîtes de la prog système dans des environnements exotiques, c'est déjà un peu foutu d'avance :o


---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 13-04-2013 à 08:11:26    

snafu8 a écrit :

@JoelF : je suis pas franchement convaincu que tu sois le plus a meme de juger de l'accessibilité d'un getting started.
@Volkhen, soit, mais ton exemple personnel reste un exemple particulier. Tout ce que je dis c'est que si un nombre significatif d'utilisateurs galèrent avec l'installation ou la configuration de boost, le problème est avant tout un problème de doc et de pédagogie.


 
heu... si un dev n'arrive pas à s'en sortir avec boost, c'est qu'il doit se remettre en question et changer de langage: le c++ n'est pas fait pour lui. Le php sera probablement plus adapté.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed