Utilisation de signaux en C
Scipion
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
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.
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.
A voir également:
- Utilisation de signaux en C
- Utilisation chromecast - Guide
- Télécharger gratuitement notice d'utilisation - Guide
- Problème de réception tv pas de signal aujourd' hui - Guide
- Vous avez utilisé ce numéro de téléphone à de trop nombreuses reprises - Forum Gmail
- Dossier en cours d'utilisation - Forum Windows 8 / 8.1
5 réponses
Bonjour,
Voici un exemple :
J'ai juste repris la structure de ton code et rajouté quelques trucs.
Cdlt,
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,
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 ?
définit que la fonction display reçoit les signaux ?
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 ;-))).
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 ;-))).
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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question