[C] Timeout dans un processus ?

Timeout dans un processus ? [C] - C++ - Programmation

Marsh Posté le 30-04-2003 à 19:05:08    

Bonjour !
 
Voilà, j'ai un petit problème avec un programme : J'ai différents processus collaborants par files de messages (envoi : msgsnd, reception : msgrcv). J'aimerais qu'un processus, si il ne recoit rien endéans les 5 secondes, envoie un message à un autre. Par contre, si il recoit quelque chose dans l'intervalle des 5 secondes, il doit envoyer un message puis recommencer un nouvel intervalle de 5 secondes.
 
J'ai pensé à différentes choses :  
 
- un msgrcv seul, mais il bloque le processus indéfiniment tant qu'il ne recoit rien (ceci si son flag est à 0) ou regarde juste une fois si il n'y a rien dans sa file (IPC_NOWAIT)
 
- un sleep, mais alors il attend 5 secondes quoi qu'il arrive.
 
- une boucle, avec des msgrcv(.... IPC_NOWAIT) et une gestion de temps avec des routines de time.h , mais on fait difficilement plus laid comme code.
 
- j'ai entendu parler de select, mais je n'ai pas compris comment l'utiliser avec msgrcv.
 
Une piste quelqu'un ?
 
Merci beaucoup !  :hello:


Message édité par Caedes le 30-04-2003 à 19:05:43
Reply

Marsh Posté le 30-04-2003 à 19:05:08   

Reply

Marsh Posté le 30-04-2003 à 21:18:19    

Personne n'a la moindre petite idée? Ca doit pas être bien sorcier !  :cry:

Reply

Marsh Posté le 01-05-2003 à 00:44:52    

caedes a écrit :

Personne n'a la moindre petite idée? Ca doit pas être bien sorcier !  :cry:  


 
jamais entendu parler des fct msgsnd et msgrcv, mais si tu parles d'utiliser la fct select, et si ca marche comme pour les socket, alors oui faut ke tu fasses un select avec timeout de x s. en sortie, le select (bloquant) te repond :  
 1. une erreur s'est produite.
 2. y a rien a recevoir dans les x sec ki se sont écoulées.
 3. y a des données a recevoir, faut faire un 'msgrcv'
 
ds le 2eme cas, le select ne retourne qu'apres les x sec. dans le 3eme, il retourne dès qu'il y a des infos a recevoir. dans le 1er ca depend.
 
voila, j'espere que ca a pas repondu a ta question.

Reply

Marsh Posté le 01-05-2003 à 09:18:44    

Merci !
 
Les fonctions msgsnd et msgrcv servent en fait à communiquer par files de message sous Linux.
 
Maintenant, je ne sais pas comment utiliser les macros FD_SET pour implémenter cela...

Reply

Marsh Posté le 01-05-2003 à 14:33:16    

caedes a écrit :

Merci !
 
Les fonctions msgsnd et msgrcv servent en fait à communiquer par files de message sous Linux.
 
Maintenant, je ne sais pas comment utiliser les macros FD_SET pour implémenter cela...


 
a mon avis le select marche surtout pour les sockets, ca m'etonnerait que tu puisses l'utiliser avec tes msgsnd et msgrcv, mais bon tu peux tjrs essayer...
 

Code :
  1. struct timeval tv = {500, 0};
  2. fd_set read_set;
  3. FD_ZERO(&read_set);
  4. FD_SET(s, &read_set);
  5. int err = select(1, &read_set, NULL, NULL, &tv);


Reply

Marsh Posté le 01-05-2003 à 15:00:09    

En fait, non, tu peux pas utiliser select avec msgrecv et msgsnd : pour select, il faut toujour avoir un descripteur de fichier et il n'y en a pas avec les IPC ... Si quelqu'un trouve, moi aussi je suis interessé, j'ai eu le même problème mais j'ai rien trouvé de bien.

Reply

Sujets relatifs:

Leave a Replay

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