Vous êtes sur la page 1sur 2

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.
Un signal est un message spécial envoyé à un processus. 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
Un signal est caractérisé par un numéro, mais au sein des programmes, on y fait souvent référence par un
nom. (Ces noms commencent 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 16 Signal à disposition des usagers

SIGUSR2 17 Signal à disposition des usagers

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) etc.
- l’appui de touches au clavier du terminal : Ctrl C (envoi de SIGINT), Ctrl \ (envoi de SIGQUIT), etc.
- l’expiration de délai préprogrammé (fonction alarm() envoi SIGALRM).
- etc.

C’est le noyau qui achemine le signal aux processus (identifiés par leur pid).
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(Quelle est la
différence? 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

1/2
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.
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.

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 deuxième paramètre est un des pointeurs vers son handler
contenant l'action à effectuer pour ce numéro de signal, Le deuxième 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)
{
++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.

2/2

Vous aimerez peut-être aussi