Executer une action toute les X secondes

Executer une action toute les X secondes - C - Programmation

Marsh Posté le 21-05-2007 à 10:38:21    

Bonjour,
 
Actuellement, un programme avec un thread unique.
Ce programme utilise select sur une socket ouverte.
Ce programme possède des modules (un peu comme apache quoi, des .so qu'on peut charger comme on vuet) et chaque module est appelé en fonction de ce que recoit la socket, et chaque module peut demandé d'envoyé qqchose dans la socket (j'utilise un tampon, et lorsque la socket etre prete en écriture, je dépile un élément du tanpon et ainsi de suite..)
 
Je voudrais rajouté la possibilité à ces modules, d'exécuté une fonction toute les X secondes.
Ma question est : comment ?
Sachant que si j'utilise une fonction telle que sigalarm, il faut que je sois en mesure de savoir pour quel module je vais travailler (pour pouvoir récuper les infos du module, or sigalarm ne prends pas de void *). Et il faut aussi que globalement (je suis pas à la ms pret), le temps doit être respecter (sachant que le processus, il s'occupe également de la socket)
Donc, sigalarm était-elle la seule solution ?
Ne serait-il pas interessant d'utiliser le timeout du select ?
autre solution ? un thread dédié pt etre ?
 
Merci

Reply

Marsh Posté le 21-05-2007 à 10:38:21   

Reply

Marsh Posté le 21-05-2007 à 15:31:08    

nORKy a écrit :

Bonjour,
 
Actuellement, un programme avec un thread unique.
Ce programme utilise select sur une socket ouverte.
Ce programme possède des modules (un peu comme apache quoi, des .so qu'on peut charger comme on vuet) et chaque module est appelé en fonction de ce que recoit la socket, et chaque module peut demandé d'envoyé qqchose dans la socket (j'utilise un tampon, et lorsque la socket etre prete en écriture, je dépile un élément du tanpon et ainsi de suite..)
 
Je voudrais rajouté la possibilité à ces modules, d'exécuté une fonction toute les X secondes.
Ma question est : comment ?
Sachant que si j'utilise une fonction telle que sigalarm, il faut que je sois en mesure de savoir pour quel module je vais travailler (pour pouvoir récuper les infos du module, or sigalarm ne prends pas de void *). Et il faut aussi que globalement (je suis pas à la ms pret), le temps doit être respecter (sachant que le processus, il s'occupe également de la socket)
Donc, sigalarm était-elle la seule solution ?
Ne serait-il pas interessant d'utiliser le timeout du select ?
autre solution ? un thread dédié pt etre ?
 
Merci


 
sigalarm ne prend pas de void * mais initialise un timer qui t'enverra un signal "SIGALRM" au bout de "x" secondes.
Tu peux créer une fonction "void attente(int sig)" que tu associe au signal SIGALRM via un "signal(SIGALRM, attente)"
Ensuite, dès que ta fonction "attente" est appelée, elle analyse le module à exécuter (en passant hélas par des variables globales ou par tout autre moyen de communication interprocessus car une fonction appelée depuis un signal ne peut recevoir qu'un seul paramètre)


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 21-05-2007 à 15:43:31    

J'ai bien compris tt cela, mais mon problème, c'est que plusieurs SIGALRM peuvent donc être en attente par un ou plusieurs module X/Y. Mon truc est de savoir pour quelle demande précise ma fonction va être appelé.
 
Si un module A demande l'apelle de la fonction X dans 20 secondes.
10 secondes.
Au moment ou X est appelé, comment je sais que c'est toto ou tutu qu'il l'a demandé ?

Reply

Marsh Posté le 21-05-2007 à 17:07:19    

Avec timer_create() tu peux donner un pointeur vers un sigevent qui sera passé au handler quand le signal est délivré.

Reply

Marsh Posté le 22-05-2007 à 10:47:16    

ok, j'ai vu ce que c'était dispo sur linux. Mais pas sur BSD :-( une idée ?

Reply

Marsh Posté le 24-05-2007 à 17:43:22    

tu peux créer un gestionnaire de timer avec un thread, et la fonction usleep. Par contre, attention si tu as besoin de précision, je n'arrive pas à avoir de timer précis au dela de 10ms environ.
Sinon, tu peux utiliser les signaux, mais attention, les appels systèmes sont interrompus lorsque ton application recoit un signal, avec comme valeur de retour errno == EINTR.

Reply

Marsh Posté le 28-05-2007 à 12:02:30    

merci, ca m'aide ce que tu me dis.
Je vais essayer avec un thread, à mon avis ca sera le plus simple.

Reply

Sujets relatifs:

Leave a Replay

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