Projet DVD-MIAGE 2010 : TP n°6 - Communication et synchronisation avec les signaux
Ce TP vise à maîtriser l'envoi et la réception de signaux entre processus sous Unix.
Travail à effectuer
À travers cet exercice, vous devrez appliquer les concepts de manipulation des signaux en utilisant les fonctions signal() et kill() présentées dans le cours et le manuel.
Exercice 1 : Réception du signal SIGINT
Écrivez le programme suivant et exécutez-le. Le signal SIGINT correspond à l'interruption du terminal (CTRL+C). Par défaut, il provoque la terminaison du processus.
#include <stdio.h>#include <signal.h>void handINT(int signo) {signal(SIGINT, handINT);printf("Réception d'un signal SIGINT\n");}int main() {signal(SIGINT, handINT);printf("Processus : %d\n", getpid());while (1) {}return 0;}Exercice 2 : Réaction aux signaux SIGUSR1 et SIGUSR2
Développez un programme C en boucle infinie qui affiche « BONJOUR » à la réception du signal SIGUSR1 et « BONSOIR » à chaque réception du signal SIGUSR2. Attention : l'action par défaut de ces signaux est la terminaison du processus.
Indice : Utilisez la fonction pause() pour attendre les signaux.
Exercice 3 : Communication entre processus père et fils
Créez un programme où un processus père initialise un gestionnaire (handler) pour afficher « BONJOUR » lors de la réception du signal SIGUSR1. Le processus fils doit afficher des informations à l'écran, puis envoyer le signal SIGUSR1 à son père avant de se terminer.
Attention : Assurez-vous que le processus fils se termine avant le processus père.
FAQ
1. Comment vérifier les signaux disponibles sous Unix ?
Consultez la page de manuel signal(7) ou utilisez la commande kill -l dans un terminal pour lister les signaux.
2. Pourquoi le processus ne répond pas aux signaux SIGUSR1/SIGUSR2 ?
Vérifiez que le gestionnaire est correctement installé avec signal() et que le processus n'est pas bloqué par une autre opération. Ces signaux ont une action par défaut de terminaison, qu'il faut désactiver.
3. Comment envoyer un signal à un processus spécifique ?
Utilisez la fonction kill() avec l'ID du processus (obtenu via getpid() ou getppid()) et le numéro du signal. Exemple : kill(pid, SIGUSR1).