Utilisation de signaux en C

Fermé
Scipion - 25 avril 2010 à 15:50
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 26 avril 2010 à 13:47
Bonjour à tous,
je développe mon premier programme en C avec des signaux. L'objectif est simple, afficher les valeurs d'un compteur toutes les secondes à l'aide d'un signal d'alarme.
J'ai été lire plusieurs fois les man de fonction telle que signal ou alarm cependant je ne suis pas vraiment à l'aise avec leur utilisation voilà donc le résultat avec mon raisonnement :

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>


int i = 0; // le compteur

void display(int sig){
printf("%d\n", i);
i++;
}


int main(int argc, char * argv []){
alarm(1); // initialise l'alarme à une seconde

while(1){ // boucle infini
/*appelle la fonction display à chaque signal de l'alarme seulement si ce signal n'est pas ignoré.*/
if (signal(SIGALRM, SIG_IGN)!=SIG_IGN){
signal(SIGALRM, display);
}
}


return 0;
}





Je sais très bien que ceci n'est pas correct cependant j'essaye de comprendre pq.
Mon objectif en initialisant l'alarme à une seconde est qu'un signal d'alarme au plus soit envoyé toutes les secondes, cependant après avoir relu plusieurs fois le man de alarm je ne comprends que très mal comment l'utiliser ainsi que ses effets.

Je me rends bien compte que ce que j'ai écrit est peut-être fondamentalement faux, si c'est le cas merci de me remettre dans le bon chemin.

5 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
25 avril 2010 à 16:19
Bonjour,

Voici un exemple :

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int i;

void display(int sig) {
  printf("%d\n",i);
  i++;
  alarm(1);
}

int main(void) {
   signal(SIGALRM, display);
   alarm(1);
   while(1);
   return 0;
}


J'ai juste repris la structure de ton code et rajouté quelques trucs.

Cdlt,
0
Je viens de tester en effet cela marche. Cependant est-ce que alarm(1) signifie que toutes les secondes il y aura un signal envoyé ? et signal(SIGALRM, display);
définit que la fonction display reçoit les signaux ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
25 avril 2010 à 17:04
En partie.
Pour être plus précis, je dirais que alarm(1) enverra un signal SIGALRM au bout d'une seconde.
Et signal(SIGALRM, display) précise que display (handler) sera le gestionnaire pour le signal SIGALRM.
Sinon il y a des façons plus portables. Mais en tout cas, voilà un programme fonctionnel ;-))).
0
En réalité ce qui m'échappe est pq est-on obligé (sinon ça ne marche pas) de remettre le alarm(1) dans le display ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
26 avril 2010 à 13:47
Alarm(1) envoit un signal SIGALRM au bout dune seconde. Une fois cette seconde écoulée le handler sera appelé mais aucune notion de récurrence. Dis autrement une fois le signal envoyé il n'y aura plus dalarme. Il faut donc la rappeler.
0