TP – Les signaux
Les signaux sont des messages envoyés entre processus.
Techniquement, le message est un numéro, et un processus
peut envoyer le message sig au processus pid
en appelant la fonction int kill(pid_t pid, int sig);.
La bibliothèque C définie des macros permettant de remplacer
des numéros de signaux par des numéros. Par exemple
SIGINT est utilisé en remplacement du signal numéro 2.
Par défaut, le système d'exploitation utilise déjà un certain nombre de
signaux :
L'attribut sa_handler peut aussi faloir SIG_DFL pour remettre
le comportement par défaut ou SIG_IGN pour simplement ignorer le signal.
- SIGINT : envoyé par le shell lorsque vous pressez ctl-c.
- SIGSEGV : envoyé par le système lorsque le processus effectue un accès mémoire invalide.
struct sigaction {
void (*sa_handler)(int); /* méthode invoquée lors de la réception d'un signal */
sigset_t sa_mask; /* signaux masqués pendant la réception, vous metterez ce champs à 0 en utilisant la fonction sigemptyset */
int sa_flags; /* un drapeau spécifiant des comportements avancés, que vous metterez à SA_NODEFER */
};
Jouons avec les signaux
Écrivez un programme en C effectuant une boucle infinie.
Votre programme doit afficher "coucou" lorsqu'il reçoit un signal SIGINT.
Ce signal est facile à générer en pressant ctl-c dans le terminal.
Modifiez votre programme pour qu'il affiche aussi "youpi" lorsqu'il reçoit un
signal SIGQUIT.
Dans un second terminal, repérez le PID de votre processus à l'aide de la commande
ps aux et utilisez la commande kill pour lui envoyer un
signal SIGQUIT.
En utilisant la méthode alarm (pensez à utiliser les pages de man),
modifiez votre programme pour qu'il reçoive un signal SIGALRM toutes
les secondes. Lors de la réception d'un SIGALRM, votre programme
doit afficher "alarme!".