|
|
Institut National des Télécommunications
Télécom INT 2è année
TP Noté CS21 du 21/05/03
(Corrigés)
Modalités
Durée : 3h00
Tous documents autorisés
Les différentes questions sont indépendantes les unes des autres.
Le barême est donné à titre indicatif des poids entre les différentes
questions. Seront notés :
- La clarté du code,
- Le fait que le code compile (sans warning),
- Le fait que le code répond correctement à la question posée,
- Le fait que le retour de chaque appel système, s'il y en a un,
est testé avec appel à
perror() , puis exit(1)
en cas de problème détecté,
- Le fait que les ressources système réservées pendant l'exécution
du programme sont libérées à la fin de l'exécution.
La "livraison de la copie" en fin de TP noté se fera par envoi d'un
mail à Michel.Simatic@int-evry.fr,
sujet "TP noté CS21" avec en pièce jointe le fichier d'extension tgz
constitué de la manière suivante :
cd ~/CS21 tar cvfz $USER.tgz TPNote
---beginCorr
Le Makefile utilisé pour compiler tous les programmes corrigés est le suivant :
Makefile.corrige
---endCorr
Préparation
Question 1 : Taille fine (2 points)
Le programme taille.c manipule la structure type_t
définie de la manière suivante :
typedef struct { char chaine1[10]; int entier1; int entier2; char chaine2[10]; } type_t;
Lors de l'exécution de taille.c , le printf("Taille
de type_t = %d\n", sizeof(type_t)) affiche que cette structure
occupe 32 octets.
Modifier cette structure (sans enlever ou modifier des champs) pour que
le printf affiche que cette structure occupe N octets, N
étant le plus petit possible.
---beginCorr
taille.corrige.c
---endCorr
Question 2 : Sens dessus dessous (5 points)
Le fichier toto.txt est constitué de 6 lignes de 8
caractères (NB : le 8è caractère de chaque ligne est le retour-chariot
'\n'). Par exemple :
Ligne 1 Ligne 2 Ligne 3 Ligne 4 Ligne 5 Ligne 6
Ecrire un programme sdd.c qui génère un fichier totoSdd.txt
(création -en mode d'accès lecture/écriture pour l'utilisateur
uniquement- si le fichier n'existe pas, troncature si le fichier existe
déjà et contient des données), version "sens dessus dessous" de toto.txt
:
- En 1ère ligne de
totoSdd.txt , la 6è ligne de toto.txt
- En 2è ligne de
totoSdd.txt , la 5è ligne de toto.txt
- ...
Si on reprend l'exemple de fichier toto.txt présenté
ci-dessus, le fichier totoSdd.txt généré contient :
Ligne 6 Ligne 5 Ligne 4 Ligne 3 Ligne 2 Ligne 1
NB : votre programme doit utiliser l'appel système lseek()
OU BIEN l'appel système mmap()
Question subsidiaire (donnant droit à un bonus de 2 points s'ajoutant
aux 5 points possibles de la question) : complétez le programme
précédent de sorte qu'il sache travailler avec un fichier toto.txt
dont le nombre de lignes est inconnu au moment de la compilation du
programme (NB : les lignes font toujours 8 caractères).
---beginCorr
sddLseek.corrige.c
sddLseekBonus.corrige.c
sddMmap.corrige.c
---endCorr
Question 3 : Les enfants de f(x) (6 points)
Le programme calcul.c implémente une fonction f(x)
= 2x + 1 . Pour ce faire, il lit un nombre au clavier, le
multiplie par 2, puis ajoute 1 avant d'afficher le résultat. Si on tape
-1, le programme s'arrête.
Modifier calcul.c pour que dans le main() ,
on crée 2 activités (processus enfant ou thread) A1 et A2:
- P, le parent de la hiérarchie, lit toujours le nombre au clavier
et le fournit à A1 , via un tube.
- A1 multiplie ce nombre par 2 et fournit le résultat à A2
, via un tube.
- A2 ajoute 1 à ce résultat et renvoie le nouveau
résultat directement à P, via un tube.
- P affiche le résultat final et se met en attente d'un nouveau
nombre.
---beginCorr
calculEnfant.corrige.c
calculThread.corrige.c
---endCorr
Question 4 : Pirates informatiques (7 points)
L'infâme pirate Barbe-Noire et ses 3 non moins infâmes lieutenants
(LeBorgne, Long Jean d'Argent et Rackham le Rose) fêtent avec force rhum
la prise d'un magnifique galion espagnol. L'alcool est-il frelaté ?
Toujours est-il que chacun des 4 hommes se met à avoir le comportement
suivant :
- RÉPÉTER 10 fois
- Essayer d'entrer dans la cale pour admirer le trésor
- Admirer le trésor dans la cale pendant Ta secondes
- Cuver son rhum pendant Tc secondes
- FIN RÉPÉTER
- Mourir (l'alcool est vraiment frelaté !)
Les valeurs de Ta et Tc sont définies dans la
table ci-dessous :
Nom du pirate
|
Valeur de Ta
(en secondes)
|
Valeur de Tc
(en secondes) |
Barbe-Noire
|
5
|
3
|
Le Borgne
|
1
|
1
|
Long Jean d'Argent
|
2
|
2
|
Rackham le Rose
|
4
|
4
|
Même ivres, les pirates respectent le code de la piraterie qui stipule
que :
- Barbe-Noire doit être seul quand il contemple le trésor. Donc :
- Quand Barbe-Noire admire le trésor, si un de ses lieutenants
essaye d'entrer dans la cale, il attend que Barbe-Noire en soit sorti,
puis il admire le trésor.
- Si Barbe-Noire essaye d'entrer dans la cale alors qu'un (ou
plusieurs) de ses lieutenant(s) est (sont) déjà dans la cale,
Barbe-Noire attend qu'il(s) soi(en)t tous sorti(s), puis il admire le
trésor.
- Un lieutenant de Barbe-Noire peut admirer le trésor avec un (ou
plusieurs) autre(s) lieutenant(s). Ainsi si un lieutenant est en train
d'admirer le trésor dans la cale et qu'un autre lieutenant essaye
d'entrer dans la cale, cet autre lieutenant entre dans la cale, sans
attendre, à partir du moment où Barbe-Noire n'est pas en train
d'attendre d'entrer dans la cale. En revanche, si Barbe-Noire est en
train d'attendre d'entrer dans la cale, cet autre lieutenant doit
attendre que Barbe-Noire soit entré dans la cale, ait admiré le trésor
et soit sorti de la cale.
Compléter le commentaire en entête du fichier pirate.c
pour indiquer le type de problème de synchronisation auquel vous êtes
confrontés avec cette histoire (exclusion mutuelle, cohorte,
producteur/consommateur...).
Puis programmer l'application pirate.c avec une activité
(processus enfant ou thread) par pirate et des sémaphores de
synchronisation (si vous avez opté pour des activités de type thread,
vous avez le choix entre les sémaphores IPC ou Posix) de sorte qu'elle
génère une possibilité d'histoire (du début jusqu'à la mort de tous les
pirates) à l'aide de printf .
Exemple d'affichage possible :
Barbe-Noire essaye d'entrer dans la cale Barbe-Noire admire le trésor dans la cale pendant 5 seconde(s) Le Borgne essaye d'entrer dans la cale Long Jean d'Argent essaye d'entrer dans la cale Rackham le Rose essaye d'entrer dans la cale Barbe-Noire sort de la cale Barbe-Noire cuve son rhum pendant 3 seconde(s) Le Borgne admire le trésor dans la cale pendant 1 seconde(s) Long Jean d'Argent admire le trésor dans la cale pendant 2 seconde(s) Rackham le Rose admire le trésor dans la cale pendant 4 seconde(s) Le Borgne sort de la cale ... Le Borgne meurt ...
---beginCorr
pirateEnfant.corrige.c
pirateThread.corrige.c
---endCorr
|