Vous êtes sur la page 1sur 3

Université BLIDA 01 Système d’exploitation 1

Département d’informatique 2ème année LMD

Gestion des Signaux sous Linux


1. Notion de signal
Les signaux sont des mécanismes permettant de manipuler et de communiquer avec des processus sous
Linux. Le sujet des signaux est vaste; nous traiterons dans les Tps que quelques uns des signaux et techniques
utilisées pour leur manipulation.
Un signal est un message spécial envoyé à un processus. Les signaux sont asynchrones; lorsqu'un processus
reçoit un signal, il le traite immédiatement. Les signaux permettent donc d'interagir sur les processus à
l'arrivée d'un événement. Ils permettent en général de signaler au processus :
- Un signal d'IT matériel
- Une erreur matérielle
- un code d'erreur système
- Un signal particulier venant d'un autre processus
2. Noms et numéros des signaux
Il y a 31 signaux de base en Unix/Linux, chacun ayant une signification différente. Chaque type de signal est
caractérisé par son numéro de signal, mais au sein des programmes, on y fait souvent référence par un nom.
(Ces noms commencens par avec SIG : SIGINT,SIGKILL etc .). Sous Linux, ils sont définis dans la bibliothèque
<signal.h>.
Exemples de signaux
Nom Numéro Rôle
SIGINT 2 Signal IT calvier 1 ctrl-c
SIGQUIT 3 Signal IT calvier 2 ctrl-\
SIGKILL 9 Signal de destruction de processus
SIGTERM 15 Signal de terminaison normale d'un processus
SIGUSR1 10 Signal à disposition des usagers 1
SIGUSR2 12 Signal à disposition des usagers 2
SIGFPE 8 Signal envoyé lorsque le processus exécute une instruction en virgule flottante invalide
SIGSEGV 11 Signal envoyé lorsque un programme effectue un accès invalide à la mémoire.
SIGCHLD 17 Linux envoie ce signal à un processus lorsque un processus fils se termine.
SIGALRM 14 Signal envoyé après l’appel system alarm.

3. Génération des signaux


Un signal peut être généré suite à :
- un problème matériel : division par zéro(envoi SIGFPE), problème d’adressage(envoi SIGSEV),
défaillance d’alimentation électrique, etc.
- l’appui de touches au clavier du terminal : Ctrl C (envoi de SIGINT), Ctrl Z (envoi de SIGSTP), etc.
- l’expiration de délai préprogrammé (fonction alarm() envoi SIGALRM) un événement logiciel des
processus partenaires (lecteur absent sur pipe, processus fils terminé ou stoppé, etc.)
- un besoin de stopper ou de terminer (plus ou moins brutalement) le processus.
C’est le noyau qui achemine le signal aux processus (identifiés par leur pid).

1/3 GUESSOUM D.
4. Emission d'un signal
Un processus peut également envoyer des signaux à un autre processus. Une utilisation courante de ce
mécanisme est de terminer un autre processus en lui envoyant un signal SIGTERM ou SIGKILL(la différence est
que le signal SIGTERM demande au processus de se terminer; le processus peut ignorer la requête en
masquant ou ignorant le signal. Le signal SIGKILL tue toujours le processus immédiatement car il est impossible
de masquer ou ignorer SIGKILL.). Une autre utilisation courante est d'envoyer une commande à un
programme en cours d'exécution. Deux signaux "définis par l'utilisateur" sont réservés à cet
effet: SIGUSR1 et SIGUSR2. Le signal SIGHUP est également parfois utilisé dans ce but, habituellement pour
réveiller un programme inactif ou provoquer une relecture du fichier de configuration.
La fonction int kill(int PID, int NUMSIG); où PID= Identité du processus destinataire NUMSIG= numéro du signal
Permet à un processus d'envoyer un signal NUMSIG à un autre processus d'identifiant PID.
Une erreur se produit si on envoie un signal à un processus n’appartenant pas au même utilisateur que le
processus émetteur. Un processus peut s’envoyer des signaux à lui-même.
On peut envoyer des signaux aussi avec la commande:
kill -<signal> <process id>
où <signal> est soit le numéro du signal, soit son nom sans le prefix SIG. Par exemple pour envoyer SIGQUIT
on utilisera
kill -QUIT <process id>
5. Réception d’un signal
Lorsqu'un processus reçoit un signal, il peut agir de différentes façons, selon l'action enregistrée pour le
signal. Pour chaque signal, il existe une action par défaut, qui détermine ce qui arrive au processus si le
programme ne spécifie pas d'autre comportement. Pour la plupart des signaux, le programme peut indiquer
un autre comportement -- soit ignorer le signal, soit appeler un gestionnaire de signal, fonction chargée de
traiter le signal. Si un gestionnaire de signal est utilisé, le programme en cours d'exécution est suspendu, le
gestionnaire est exécuté, puis, une fois celui-ci terminé, le programme reprend.
La fonction signal peut être utilisée pour paramétrer l'action à effectuer en réponse à un signal.
Le premier paramètre est le numéro du signal. Le deuxieme parametre est un des pointeurs vers son handler
contenant l'action à effectuer pour ce numéro de signal, Le deuxieme paramétre peut prendre une des trois
valeurs suivantes:
 SIG_DFL, qui correspond à l'action par défaut pour le signal;
 SIG_IGN, qui indique que le signal doit être ignoré;
 Un pointeur vers une fonction de gestion de signal. La fonction doit prendre un paramètre, le numéro
du signal et être de type void.
Exemple :Cet exemple, utilise une fonction de gestion de signal pour compter le nombre de fois où le
programme reçoit le signal SIGUSR1.
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
int sigusr1_count = 0;
void handler(int signal_number)

2/3 GUESSOUM D.
{
++sigusr1_count;
}
int main ()
{
signal(SIGUSR1, handler);
/* Faire quelque chose de long ici. */
/* ... */
printf ("SIGUSR1 a été reçu %d fois\n", sigusr1_count);
return 0;
}

6. Primitive d'attente de signaux


La fonction int pause() Permet à un processus de se mettre en attente bloquante de n'importe quel signal.
Apres le réveil (fin de traitement du signal) la fonction renvoie la valeur -1.
La fonction sleep(int nSec) permet à suspendre un processus nSec secondes.

3/3 GUESSOUM D.

Vous aimerez peut-être aussi