TP 10 (prog. système) Signaux - IUT d'Arles
TP 10 (prog. système) Signaux - IUT d'Arles
TP 10 (prog. système) Signaux - IUT d'Arles
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Iut Arles / A1SE<br />
Systèmes d’exploitation<br />
}<br />
note : la fonction « atexit » dans le fichier source peut vous aider pour désaloouer les<br />
ressources avant de sortir du <strong>prog</strong>ramme.<br />
2. Exercice 2 : mise en place d'une alarme<br />
Nous allons maintenant étudier la gestion d'une alarme par récupération du signal<br />
correspondant. On peut positionner une alarme par la fonction « alarm(secondes) ». Le code<br />
source d'exemple est « test_signal_alarme.cpp ». Il complète le précèdent en ajoutant une<br />
attente d'un événement d'alarme sur un timer réglé à 5 secondes. Si l'utilisateur ne s'est pas<br />
manifesté, le <strong>prog</strong>ramme se termine.<br />
3. Exercice 3 : signaux temps réels<br />
Les 32 autres signaux Linux sont disponible pour l'utilisateur. La valeur minimale de leur rang<br />
est donnée par SIGRTMIN (valeur prédéfinie du système, normalement 34). Un processus gère<br />
une file de signaux reçus (max. <strong>10</strong>24) dans laquelle il prend au fur et à mesure. Les<br />
occurrences sont automatiquement éliminées. On peut attacher au signal quelques<br />
informations, comme le montre l'exemple ci-dessus (entier ou pointeur sur un tableau<br />
d'entiers).<br />
Les prérequis sont : d'avoir 2 processus au moins, de déclarer (pour le receveur) une structure<br />
qui contient les signaux qu'il bloque (sigemptyset, sigaddset), une structure pour récupérer les<br />
informations (struct siginfo infos_recues), un masquage des signaux courants pour filtrer ceux<br />
qui l'intéresse (sigprocmask) et d'attendre (sigwaitinfo, bloquant). Pour l'émetteur, il suffit<br />
d'empaqueter les informations dans une structure et de les placer dans la file des messages du<br />
receveur (sigqueue).<br />
Exemple de code pour envoyer des signaux temps réels d'un processus à un autre (cf .<br />
« test_signal_tempsreel_perefils.cpp ») :<br />
● le père utilise « sigqueue() » pour envoyer un message :<br />
int execution_pere(const unsigned int _pid_fils) {<br />
//une structure pour contenir des informations à envoyer par le message<br />
union sigval infos_envoyees;<br />
//on stocke dans la structure infos_envoyees la valeur <strong>10</strong><br />
infos_envoyees.sival_int = <strong>10</strong>;<br />
std::cout