select() : ordre de priorité

select() : ordre de priorité - C - Programmation

Marsh Posté le 15-06-2007 à 17:09:35    

Bonjour, j'utilise select dans mon programme sur une socket et sur un /dev/ttyS.
Le programme se charge de transmettre les données recu d'un coté, de l'autre coté (et vice versa).
 
Voici mon code :  
 

Code :
  1. while (1) {
  2.  tv.tv_sec = 0;
  3.  tv.tv_usec = 5000L;
  4.  FD_ZERO(&readfds);
  5.     FD_SET(tty_fd, &readfds);
  6.  FD_SET(s_server, &readfds);
  7.  FD_SET(s_cli, &readfds);
  8.  rSelect = select(MAX(MAX(s_server, s_cli), tty_fd) + 1, &readfds, NULL, NULL, &tv);
  9.     if (rSelect == -1)
  10.   exit(EXIT_FAILURE);
  11.  if (!rSelect && poll_ir) {
  12.   pollIR(); // écrit sur tty_fd
  13.   poll_ir = 0;
  14.   continue;
  15.  }
  16.  if (FD_ISSET(tty_fd, &readfds)) {
  17.   readIRAndSendToSocket(); //lis tty_fd et écrit sur s_cli
  18.   poll_ir = 1;
  19.   continue;
  20.  }
  21.  if (FD_ISSET(s_server, &readfds)) {
  22.   s_cli = accept(s_server, 0, 0);
  23.   continue;
  24.  }
  25.  if (FD_ISSET(s_cli, &readfds)) {
  26.   readSocketAndSendToTTYS(&s_cli); // lis s_cli et écrit sur tty_fd
  27.   continue;
  28.  }
  29.    }


 
quand select arrive en timeout, la fonction PollIR() est appelé, elle envoie une commande sur le port COM. Quand le port COM envoie la reponse, select appelle readIRAndSendToSocket().
Cependant, si entre temps des données sont accessible en lecture par la socket, select va appeler readSocketAndSendToTTYS(); et apres ca je ne recevrai jamais plus la réponse du port COM et comme le flag poll_ir est a 0, la boucle pollIR() est bloqué :/.
 
Je ne comprends pas pourquoi select ne m'informe pas que des données sont en attente sur le port com :/


Message édité par azubal le 15-06-2007 à 17:14:10
Reply

Marsh Posté le 15-06-2007 à 17:09:35   

Reply

Marsh Posté le 28-06-2007 à 14:23:09    

voici ce qui me saute aux yeux moi :
Si tu mets des continue partout, si tu passe dans un if, forcement, tu passeras jamais dans les suivant.
Donc, si tu passes dans readSocketAndSendToTTYS(); tu ne passeras pas dans readIRAndSendToSocket();

Reply

Marsh Posté le 28-06-2007 à 18:03:31    

Je passerai dedans a l'itération suivante..
En faite ce code marche tres bien sur mon PC.  
Mais c'est lorsque je le passe sur un système embarqué (sur une foxboard) que je rencontre le problème..
Je me demande si c'est un problème de conception ou si c'est un problème plus bas niveau sur la carte...

Reply

Sujets relatifs:

Leave a Replay

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