Cours:TdProgSyst
Td 12 Eléments de programmation système
Gestion des signaux
Deux fonctions du langage C permettent de travailler avec les signaux d’UNIX: la fonction **kill** et **signal**. La première permet d’envoyer un signal à un processus dont on connait le numéro de processus (le PID), et
la fonction signal permet d’associer une fonction écrite par
l’utilisateur à un signal UNIX: lorsque ce dernier est reçu, la fonction est
exécutée.
Les signaux les plus classiques sont les suivants:
SIGINT signal envoyé par UNIX lors d’un Ctrl C pour stopper le processus SIGHUP signal émis par UNIX lors de la déconnexion SIGALRM signal émis par la fonction alarm() SIGUSR1 signal à la disposition de l’utilisateur SIGUSR2 autre signal à la disposition de l’utilisateur
Un exemple d’utilisation de ces fonctions est représenté ci-dessous:
#include <stdio.h> #include <sys/types.h> #include <signal.h>
void gestion_signal() {
... // code de gestion du signal
}
main() {
...
signal(SIGUSR1,gestion_signal); // qd on reçoit SIGUSR1, exécute gestion_signal()
...
}
Chaque fois que le processus recevra le signal SIGUSR1, on ira exécuter la fonction gestion_signal. Pour ceux qui connaissent le concept d’ interruption, il s’agit ici d’une interruption logicielle.
La fonction alarm permet à un processus de s’auto-envoyer le signal SIGALRM au bout d’une certaine temporisation exprimée en secondes.
Exercices
1. Ecrire un programme ignorant les arrêts claviers (CTRL+C, ...).
2. Ecrire un programme ignorant le signal émis lors de la déconnexion.
3. Ecrire un programme affichant toutes les dix secondes la chaîne de
caractères "coucou" sur l’écran.
4. Ecrire un programme permettant d’afficher le numéro des signaux
reçus par le programme.