Département INFormatique 
  CSC4508/M2 : Concepts des systèmes d'exploitation et mise en œuvre sous Unix
    Évaluation

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

cd
mkdir CS21
cd CS21
cp ~simatic/CS21/tpNote.tgz .
tar xvfz tpNote.tgz
cd TPNote

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
    • Sortir de la cale
    • 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

Page mise à jour le 15 mai 2006