Département Informatique Semestre 3 Semaine 49/50 – 2006
TD 08 – Les signaux Page 1/3
ASR4 – Systèmes d’exploitation TD 08 – Les signaux
Durée : 2 séances
1 Rappels : les signaux
1.1 Réception d'un signal
En général, le traitement par défaut proposé par Unix est la terminaison du processus accompagnée éventuellement d'une copie de l'image de la région de mémoire qui le concerne.
Cette copie est contenue dans un fichier appelé « core » qui se trouve dans le répertoire de connexion « $HOME » de l'utilisateur. Ce fichier peut ensuite être analysé au moyen d'outils pour retrouver d'éventuelles erreurs. Pour cela, le signal SIGQUIT (en générale « Ctrl+\ », c.f. annexe) est très utile pour avoir une copie de l’image de la région-mémoire. Toutefois, si l'utilisateur veut modifier le comportement par défaut d'un processus face à l'un des événements mentionnés au tableau des signaux, il mettra en oeuvre la primitive signal:
#include <signal.h>
signal ( int signum, void (*fonct)(int))
signum : Numéro du signal à capturer compris entre 1 et NSIG. Ces numéros sont par des
« #define » dans le fichier de référence « /usr/include/signal.h » (1=SIGHUP, 2=SIGINT, 3=SIGQUIT, etc.). Utiliser les noms des signaux plutôt que les numéros de signal.
fonct : Adresse de la séquence, c'est-à-dire de fonction au sens du langage C, où le processus sera dérouté à l'arrivée du signal. En outre, il existe deux "séquences" macro-définies dans
« /usr/include/signal.h. »:
SIG_IGN : pour ignorer purement et simplement l'événement correspondant au signal.
SIG_DFL : pour un retour au traitement par défaut, après avoir demandé un traitement spécifique de l'événement.
Remarques : le numéro du signal reçu est transmis en argument de la fonction « fonct ». Ceci permet à une même séquence de traiter plusieurs cas de signaux en les distinguant par leur numéro. A l'issue de l'exécution de la séquence « fonct » les systèmes Unix System V rétablissent automatiquement le traitement par défaut, tandis que les systèmes Unix BSD reconduisent la programmation annoncée par la primitive « signal » pour le signal à traiter.
Un utilisateur Unix System V qui veut maintenir la capture du signal recherché devra programmer un nouvel appel à la primitive « signal » avant la sortie de « fonct ».
1.2 Emission d'un signal
Elle se fait par la primitive kill, avec la syntaxe:
kill (int pid, int sig)
Département Informatique Semestre 3 Semaine 49/50 – 2006
TD 08 – Les signaux Page 2/3
sig : Numéro du signal à émettre compris entre 1 et NSIG. Si ce numéro est 0 alors, aucun signal n'est émis. Ceci peut servir pour tester l’existence de processus.
pid : Numéro du processus vers lequel doit être émis le signal. Les processus émetteurs et récepteurs du signal doivent être du même propriétaire.
La valeur retournée est 0 en cas de réussite, et -1 si le processus récepteur n'existe pas. Ainsi
« while (kill (0,x)) { ... } » permet de tester l'existence d'un numéro de processus.
1.3 Attente de l'arrivée d'un signal:
Elle se fait par la primitive pause, avec la syntaxe:
pause()
Le processus est mis en attente de l'arrivée d'un signal quel qu'il soit et d'où qu'il vienne. Il va de soi que ce processus ne doit pas ignorer l'arrivée d'un signal qu’il est censé recevoir.
1.4 Effacement d'un fichier :
unlink ("nom_de_fichier")
"nom_de_fichier" : Nom complet d'un fichier ordinaire Unix sous la forme habituelle /rep0/rep1/... .../repn/nom_simple.
2 Exercices
2.1 Capture des signaux
Écrire un programme C dont la séquence principale:
- capture les signaux "Break" (SIGINT), "Quitte" (SIGQUIT), "Utilisateur 1"
(SIGUSR1), et "Utilisateur 2" (SIGUSR2)
- réserve un fichier, dans le répertoire $HOME, ayant pour nom pid-nnnnn, nnnnn étant le numéro du processus courant,
- affiche le nom de ce fichier,
- le processus part dans une boucle de traitement sans fin, par exemple: « for (;;); »
char fichier[255];
sprintf(fichier,"/tmp/%s-%d",getenv("LOGNAME"),getpid());
Les séquences de capture appropriées devront indiquer par message explicite le type de signal reçu, détruire le fichier temporaire créé en début de séquence principale, pour les signaux
"Break" et "Quitte", et sortir de l'exécution sur signal "Quitte". On reviendra au traitement par défaut après au moins 2 apparitions du signal "Utilisateur 1".
Département Informatique Semestre 3 Semaine 49/50 – 2006
TD 08 – Les signaux Page 3/3
2.2 Combat entre pères et fils
Dans l'exercice suivant le père et le fils devront faire précéder chacun de leur message dans la sortie standard par « PERE[pid] : » pour le père et pour le fils « FILS[pid] : »
Le père et le fils possèdent chacun entre 5 et 10 points de vie tirés au hasard au début du programme. Ils afficheront cette valeur à l'écran. Quand l'un des deux processus possède un nombre de points de vie inférieur à 1, le processus affiche « Arghhh !! Je meurs ! ». Lorsque le père ou le fils touche l'autre processus, celui-ci perd un point de vie et affiche « Aïes, je suis touché ». Puis à son tour, il tire sur l'autre processus.
Les deux processus se lancent des signaux de terminaison en affichant le message « Pan ! ...».
- SIGTERM permet de tirer sur son adversaire
- SIGUSR1 pour signaler à son adversaire que l'on n’est pas encore mort
- SIGUSR2 pour signaler à son adversaire que l'on est à l'agonie et que l'on va mourir
Le processus « vainqueur » doit afficher le résultat de sa victoire.
3 Annexe : Noms des signaux sous UNIX
Nom Événement par défaut
SIGHUP Déconnexion du terminal Terminaison
SIGINT Touche "Break" (en gal: Ctrl+C) Terminaison
SIGQUIT Touche "Quitte" (en gal: Ctrl+\) Terminaison + fichier core SIGILL(*) Instruction illégale Terminaison + fichier core SIGTRAP Traitement en pas à pas (mise au point) Terminaison + fichier core SIGABRT ou
SIGIOT(*)
Problème matériel Terminaison + fichier core SIGFPE Erreur dans opération flottante Terminaison + fichier core SIGKILL Force la terminaison d'un processus Terminaison
SIGBUS(*) Erreur sur le bus Terminaison + fichier core
SIGSEGV(*) Violation de segment mémoire Terminaison + fichier core SIGSYS Erreur dans un appel système Terminaison + fichier core SIGPIPE Ecriture dans un tube sans lecteur Terminaison
SIGALRM Délai d'horloge Terminaison
SIGTERM Terminaison normale d'un processus Terminaison SIGUSR1 A la disposition de l'utilisateur Terminaison SIGUSR2 A la disposition de l'utilisateur Terminaison SIGCHLD Adressé au père à la fin d'un fils Signal ignoré
SIGSTOP Suspension d’un processus Processus suspendu
SIGTSTP Touche "Susp" (en gal Ctrl+Z) Processus suspendu SIGCONT Relance d’un processus stoppé Processus relancé/signal ignoré
SIGTTIN Lecture par un processus d'arrière-plan Processus suspendu SIGTTOU Ecriture par un processus d'arrière-plan Processus suspendu (*) Portabilité non garantie.