La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Communication entre Processus

Présentations similaires


Présentation au sujet: "Communication entre Processus"— Transcription de la présentation:

1 Communication entre Processus
1. Les Signaux

2 Sommaire 1) Définition. 2) Liste des signaux.
3) Aspects du traitement des signaux par le noyau. a. Envoie d’un signal. b. Prise en compte d’un signal. b.1 Ignorer le signal. b.2 Exécuter l’action par défaut. b.3 Exécuter une procédure spécifique. c. Signaux et héritage. d. Structure de donnée associée à un signal. 4) Programmation des signaux. a. Envoyer un signal. b. Attacher un Handler à un signal. c. Attente d’un signal. d. Armer une temporisation.

3 Définition Un signal est une interruption logicielle asynchrone qui a pour but d’informer de l’arrivée d’un événement (outil de base de notification d’évènement). Sous UNIX un signal est identifié par un numéro et est décrit par un nom (significatif) préfixé par la constante « SIG ».

4 Liste des signaux Le noyau UNIX admet 64 signaux différents.
Les signaux 1 à 31 correspondent aux signaux classiques. Les numéros 32 à 63 correspondent aux signaux temps réel que nous n’allons pas étudier ici. Le tableau ci-dessous donne la liste des signaux classiques en précisant l’événement auquel ils sont attachés.

5 Liste des signaux Numéro Nom Description 1 SIGHUP
Instruction (HANG UP) - Fin de session 2 SIGINT Interruption du clavier (frappe de « Ctrl+C ») 3 SIGQUIT Caractère « quit » frappé depuis le clavier (Frappe de « Ctrl \ ») 4 SIGILL Instruction illégale 5 SIGTRAP Trace trap (Point d’arrêt pour le débogage) 6 SIGIOT /SIGABRT Terminaison anormale 7 SIGBUS Erreur de bus 8 SIGFPE Erreur mathématique virgule flottante 9 SIGKILL Terminaison forcée du processus 10 SIGUSR1 Signal utilisateur 1 11 SIGSEGV Violation de mémoire (Référence mémoire invalide) 12 SIGUSR2 Signal utilisateur 2 13 SIGPIPE Ecriture dans un tube sans lecteur 14 SIGALRM Horloge temps réel, fin de temporisation 15 SIGTERM Signal de terminaison 16 SIGSTKFLT Stack Fault (Erreur de pile du coprocesseur) 17 SIGCHLD ou SIGCLD Processus fils terminé

6 Liste des signaux Numéro Nom Description 18 SIGCONT
Demande de reprise du processus 19 SIGSTOP Stoppe l’exécution d’un processus 20 SIGTSTP Demande de suspension depuis le clavier 21 SIGTTIN lecture terminal en arrière-plan 22 SIGTTOU écriture terminal en arrière-plan 23 SIGURG évènement urgent sur socket 24 SIGXCPU temps maximum CPU écoulé 25 SIGXFSZ taille maximale de fichier atteinte 26 SIGVTALRM alarme horloge virtuelle 27 SIGPROF Profiling alarm clock 28 SIGWINCH changement de taille de fenêtre 29 SIGPOLL (System V) occurence d'un évènement attendu 30 SIGPWR Chute d’alimentation 31 SIGSYS Erreur d'appel système 32 SIGUNUSED Non utilisé

7 Traitement d’un signal a. Envoie d’un signal
Un processus peut recevoir un signal de deux façons différentes : Un signal lui est envoyé par un autre processus par l’intermédiaire de l’appel système kill () que nous détaillerons dans la partie programmation des signaux. Exemple: le Shell envoie le signal SIGKILL si la commande kill -9 pid est frappé ; L’exécution du processus a levé une trappe (exécution d’une instruction non autorisée : division par 0) et le gestionnaire d’exception associé positionne un signal pour signaler l’erreur détectée. Exemple: l’occurrence d’une division par zéro amène le gestionnaire d’exception divide_error () à positionner le signal SIGFPE. Un signal ainsi délivré mais pas encore pris en compte par le processus destinataire est qualifié de signal pendant.

8 Traitement d’un signal b. Prise en compte d’un signal
La prise en compte d’un signal par un processus s’effectue : Lorsque celui-ci s’apprête à quitter le mode noyau pour repasser en mode utilisateur Avant de passer dans un état bloqué. En sortant de l’état bloqué.

9 Traitement d’un signal b. Prise en compte d’un signal
b.1 Ignorer le signal Lorsque le signal est ignoré, aucune action n’est entreprise au moment de sa prise en compte. Une exception existe cependant concernant le signal SIGCHLD. Lorsque ce signal est ignoré, le noyau force le processus à consulter les informations concernant ces fils zombies de manière à ce que leur prise en compte soit réalisée et que les blocs de contrôle associés soient détruits.

10 Traitement d’un signal b. Prise en compte d’un signal
b.2 Exécuter l’action par défaut Le système d’exploitation associe à chaque signal une action par défaut (Gestionnaire par défaut du signal) ; ces actions par défaut sont de 5 natures : Abort: abondon ou terminaison du processus et génération d’un fichier core contenant son contexte d’exécution, ce fichier core est exploitable par l’outil débogueur : SIGFPE, SIGQUIT… ;

11 Traitement d’un signal b. Prise en compte d’un signal
Exit: terminaison du processus sans génération d’un fichier core: SIGINT 1 , SIGKILL, SIGUSR1, SIGUSR2 ; Ignore (le signal est ignoré) : SIGCHLD ; Stop (suspension du processus : passage à l’état bloqué) : SIGSTOP ; Continue (reprendre l’exécution si le processus est suspendu sinon le signal est ignoré) : SIGCONT ;

12 Traitement d’un signal b. Prise en compte d’un signal
b.3 Exécuter une procédure spécifique Le processus ne peut pas modifier l’action par défaut de SIGKILL et SIGSTOP Par contre pour des signaux telles que SIGINT, SIGUSR1, SIGUSR2..., l’action par défaut peut être modifié, pour cela le processus doit associer au signal une autre procédure de gestion c’est le Handler. Quand un signal arrive et le Handler sera pris en compte par le noyau le processus revient en mode utilisateur pour exécuter la procédure associé, à la fin de l’exécution de la procédure le processus poursuit son exécution à son point de déroutement vers le mode noyau.

13 Traitement d’un signal b. Prise en compte d’un signal
Remarque 1 : On peut associer un même gestionnaire (Handler) à des signaux différents. Remarque 2 : Les signaux SIGKILL, SIGSTOP ne peuvent être ni capturés (modifier leur actions par défaut), ni bloqués, ni ignorés.

14 Signaux et héritage Un processus fils n’hérite pas des signaux pendants de son père, mais il hérite les gestionnaires (Handler). En cas de recouvrement du code hérité du père (le fils exécute la fonction execlp…), les gestionnaires par défaut sont réinstallés pour tous les signaux du fils.

15 Structure de donnée associée à un signal
Dans le PCB d’un processus, on retrouve trois tables (1 entrée par signal) qui servent à la gestion des signaux : Table des signaux pendants (en attente) : on a 1 bit par signal. Le bit est 1 si le signal associé est en attente. Table des signaux masqués (bloqués) : on a 1 bit par signal. Le bit est 1 si le signal associé est bloqué. Table des gestionnaires des signaux (bloqués) : on a 1 pointeur par signal. Le pointeur est nul si le signal associé est bloqué.

16 Programmation des signaux a. Envoyer un signal
Comme nous l’avons vu précédemment un signal peut être envoyé soit à partir du Shell soit par un processus en appelant la primitive kill () dont le prototype est : #include <sys/types.h> #include <signal.h> int kill ( pid_t pid, int sig); L’interprétation du résultat de la fonction diffère en fonction de la valeur présente dans le champ pid: Si pid > 0, le signal sig est envoyé au processus pid. Si pid = 0, le signal est envoyé à tous les processus du groupe du processus émetteur. Si pid < 0 (en dehors de la valeur -1), le signal est envoyé à tous les processus du groupe dont le PGID = |pid|. Si pid = -1, le signal est envoyé à tous les processus du système sauf le processus 1 et le processus appelant. La primitive kill retourne 0 en cas de succès et -1 en cas d’erreur.

17 Programmation des signaux : b. Attacher un Handler à un signal :
La primitive qui permet d’attacher un gestionnaire de traitement à un signal est l’appel système signal(), son prototype est : #include <signal.h> void(*signal(int sig,void(*func)(int)))(int) ; sig : représente le numéro ou le nom du signal. func : c’est la fonction à exécuter, à l’arrivé du signal. Le Handler (la procédure) défini par *func est attaché au signal sig, désigné par le nom qui lui est associé. L’argument func peut prendre trois valeurs distinctes : func = SIG_DFL: l’action par défaut est attaché au signal sig. func = SIG_IGN: alors le signal sig est ignoré, elle est utilisé pour les processus en arrière plan ; func est un pointeur vers une procédure Handler définie dans le code utilisateur. La prise en compte du signal sig par le processus entraine l’exécution de cette procédure. En cas d’échec, la fonction signal() renvoie la valeur SIG_ERR.

18 Programmation des signaux : c. Attente d’un signal
L’appel système pause() suspend l’appelant jusqu’au prochain signal. Son prototype est : #include <unistd.h> int pause (void) ; L’appel système sleep(v) suspend l’appelant jusqu’au prochain signal ou l’expiration du délai (v secondes). Son prototype est : void sleep (int );

19 Programmation des signaux : d. Armer une temporisation
La primitive alarme permet à un processus d’armer une temporisation. A l’issue de cette temporisation le signal SIGALRM est délivré au processus. Le comportement par défaut est d’arrêter l’exécution du processus. Le prototype de la fonction est : #include <unistd.h> Unsigned int alarm (unsigned int nb_sec); Une temporisation d’une durée égale à nb_sec seconds est armée. Remarque: L’opération alarm(0) annule une temporisation précédemment armée.


Télécharger ppt "Communication entre Processus"

Présentations similaires


Annonces Google