TP Signaux UNIX
B. Dupouy et S. Gadret
| 1ère partie | Exemples à faire fonctionner |
| 2ème partie |
Exercice à rendre. L'envoyer par mail à l'enseignant qui vous fait les cours, par exemple : dupouy@inf Le texte du sujet ( subject ) doit contenir le mot : TPX pour les X-IGE1 TPAST pour les AST maîtrises TP1A pour les éléves de 1ère année |
Les signaux ont des origines diverses, ils peuvent être :
Remarque : l'émetteur ne peut pas savoir si le destinataire a reçu ou non le signal.
Réception, comportements possibles du destinataire du signal :
| ignorer le signal | signal(num_du_signal,SIG_IGN) |
| repositionner le traitement par défaut | signal(num_du_signal,SIG_DFL) |
| définir un traitement spécifique | signal(num_du_signal,fonction) |
L'ensemble des signaux est décrit dans /usr/include/sys/signal.h ou dans /usr/include/bits/signum.h.
Remarques :
Ecrire un programme qui ignore TOUS les signaux.
Le schéma de programmation est donné ci-dessous. Le rôle du while(1) est de boucler pour attendre la réception d'un signal.
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int main(void){
int Nb_Sig;
for(Nb_Sig = 1; Nb_Sig < NSIG ; Nb_Sig ++){
...
...
}
while(1){
sleep(5);
} /* Attendre des signaux */
return 0;
}
A FAIRE :
Modifier le programme précédent : les signaux ne seront plus ignorés, mais traités par une fonction spéciale, que l'on appellera Traite_Sig.
Le schéma de programmation est donné ci-dessous. Le rôle du while(1) est de boucler pour attendre la réception d'un signal.
#include <signal.h>
#include <unistd.h>
int main(void){
void Traite_Sig(int Numero);
int Nb_Sig ;
for(Nb_Sig = 1; Nb_Sig < NSIG ; Nb_Sig ++){
...
...
}
while(1){
sleep(5); /* Attendre des signaux */
}
}
/************* Fonction de traitement **************/
void Traite_Sig (int Numero){
printf("Coucou, recu signal %d !\n", Numero);
...
}
Faire comme précédemment, c'est à dire :
Attention :
Sur les UNIX de la famille Berkeley, par exemple Solaris de Sun,
après exécution de la fonction spécifique
définie par l'utilisateur, l'option par défaut est
rétablie. Si on veut conserver l'option spécifique il faut
rappeler signal(num_sig, fonction) dans fonction.
Ceci n'est pas utile sous LINUX, qui est un UNIX à base System V.
Une tentative d'accès à un zone
mémoire interdite se traduit par l'envoi d'un signal SIGSEGV ou SIGBUS au processus fautif.
La réception de l'un de ces signaux provoque la fin du processus.
Pour éviter cette fin, mais être avertis des éventuelles erreurs,
nous allons écrire un programme qui provoque ce type d'erreur
et traite de façon spécifique les signaux reçus.
Pour récupérer le canevas du programme, cliquer ici.
Questions :
Ecrire un programme (canevas donné plus bas) qui :
A FAIRE :
Schéma du programme :
©(Copyright)
dupouy@inf.enst.fr
#include <signal.h>
#include <unistd.h>
int main (void){
...
/* Mettre ici le traitement pour tous les signaux
sauf SIGUSR1 et SIGUSR2. */
...
/* Mettre ici le traitement pour SIGUSR1 et SIGUSR2 */
...
while (1){
printf("main : pid %d attend des signaux \n", (int)getpid());
sleep(5);
} /* Attendre les signaux */
}
/*************** La fonction fonc **************/
void fonc (int NumSignal){
...
}
/*************** La fonction fonc1 **************/
void fonc1 (int NumSignal){
...
}
/*************** La fonction fonc2 **************/
void fonc2 (int NumSignal){
...
}