10.03.2014 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!