Test de Système

(8 décembre 2000 – durée : 2h)

 © D. Mathieu    mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique
Créé le 08/12/2001 - Dernière mise à jour : 08/12/2001

Tout document autorisé

Millisleep()

Nom

        Millisleep - Endormir le processus pour une durée déterminée.

Synopsis

 
unsigned long MilliSleep (unsigned long NbMilliSec);
Description

       MilliSleep() endort le processus jusqu'à ce que NbMillSec milli-secondes se soient écoulées, ou jusqu'à ce qu'un signal  non-ignoré soit reçu.

Valeur renvoyée

       MilliSleep()  renvoie zéro si le temps prévu s'est écoulé, ou le nombre de milli-secondes restantes si un signal a réveillé  le processus.

Travail demandé : écrire la fonction Millisleep()

    Utiliser un timer système ITIMER_REAL. Bloquer le processus dans un appel à la fonction système pause() jusqu'à réception de SIGALRM. Ne pas utiliser les classes CTimeval, CTimerReal, etc., mais seulement les fonctions et structures de base du système (setitimer(), struct itimerval, etc.). Penser qu'avant l'appel de MilliSleep(), l'utilisateur a pu ignorer ou dérouter SIGALRM. Il a pu aussi armer le timer ITIMER_REAL. Dans ce cas, ll faut le réarmer dans l'état dans lequel il était avant l'appel de MilliSleep(),avant de retourner de la fonction. On supposera en revanche que le signal SIGALRM n'est pas bloqué en entrant dans la fonction.

    Ne pas gérer les éventuelles exceptions.

Corrigé :  Millisleep.cxx


Nanosleep()

    Dans la fonction nanosleep() que vous avez déjà utilisée :
 
int nanosleep(const struct timespec *req, struct  timespec *rem);

le paramètre rem n'est rempli, avec le temps restant avant une expiration qui aurait été normale, que lorsque la fonction a été interrompue.

1) - Dans l'espace de nom nsSysteme, écrire la fonction Nanosleep(), avec un seul paramètre donné-résultat de type timespec. Cette fonction ne renvoie rien. Elle appelle ::nanosleep() de telle sorte que :

2) - Ecrire une fonction ppal() correspondant à un processus qui s'endort 10 secondes ou qui se réveille lorsque le processus reçoit le signal SIGINT. A son réveil, le processus affiche le temps qu'il lui restait normalement à dormir.

3) - Surcharger la fonction Nanosleep() de façon à ce qu'elle n'ait qu'un paramètre donné, et qu'elle renvoie le temps restant à dormir (attention aux règles de surcharge en C++).

4) - Ecrire un programme qui appelle cette dernière version de Nanosleep(), et qui affiche au réveil, en plus du temps restant à dormir, si Nanosleep() a été ou non interrompue.
 
Corrigé :  Nanosleep.cxx

© D. Mathieu    mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique