Utilisation de signaux en C

Scipion -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
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   Statut Contributeur Dernière intervention   1 846
 
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
Scipion
 
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   Statut Contributeur Dernière intervention   1 846
 
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
scipion
 
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   Statut Contributeur Dernière intervention   1 846
 
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