Gestion Des Signaux Sous Linux
Gestion Des Signaux Sous Linux
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
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.
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;
}
2/2