• Aucun résultat trouvé

ASR4 – Systèmes d’exploitation TD 08 – Les signaux

N/A
N/A
Protected

Academic year: 2022

Partager "ASR4 – Systèmes d’exploitation TD 08 – Les signaux"

Copied!
3
0
0

Texte intégral

(1)

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)

(2)

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".

(3)

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.

Références

Documents relatifs

Pour faire une preuve de terminaison, on cherche donc ce que l’on appelle un variant de boucle ou encore une fonction de terminaison, c’est à dire une suite d’entiers

Puis souligne la terminaison du verbe qui correspond au sujet souligné..  Mon père accepte

Chaque verbe peut s’écrire de plein de façons différentes car sa terminaison change souvent..  exemples : chante, chantes,

Montrons qu’un pr´ e-bel ordre nous permet de d´ efinir une sous-suite strictement croissante.. Deux cas se pr´ esentent : si B est de cardinal infini, alors la suite d´ es ´

On remarque qu’à chaque itération de la boucle while, une partie de P est laissée identique ou coupée en deux, donc P est l’ensemble des feuilles d’un arbre binaire de racine

État du processus et transmission du jeton Lorsque P i reçoit un message, il passe à l’état Actif Un processus Actif ne transmet pas le jeton, il le transmettra dès qu’il

Si on considère le vecteur poids des émissions libres d'un processus au cours d'une dérivation, alors chaque utilisation de la règle réplication (et chaque utilisation de la règle

Critère de terminaison par paires de dépendances Théorème : Un système de réécriture R termine s'il existe un préordre % stable par substitutions et monotone t.q. On remplace