Lorsque plusieurs processus s'exécutent simultanément, il est difficile de savoir quelle ligne a été imprimée par chacun d'entre eux à l'écran. L'objectif de ce premier exercice est d'implémenter une bibliothèque (appelée par exemple affichage-processus) qui facilite la lecture des messages à l'écran dans un contexte multi-processus. La question A décrit le contenu de la bibliothèque et la question B décrit comment tester la bibliothèque.
A - Dans cette bibliothèque vous implémenterez 3 procédures C, prenant en paramètre une chaîne de caractère et affichant :
1) La chaîne de caractère précédée du numéro
d'identification du processus.
2) La chaîne de caractère précédée du numéro d'identification de son père.
3) La chaîne de caractère précédée des deux informations ci-dessus.
B- Dans trois autres fichiers C distincts vous implémenterez trois fonctions main permettant de tester votre bibliothèque.
- testIB1.c
: Un programme qui affiche
"bonjour" précédé du numéro d'identification du processus et de son père.
- testIB2.c
: Un programme qui se dédouble par l'appel fork et
pour lequel les processus père et fils affichent respectivement "père" et
"fils" précédés des mêmes informations que ci-dessus.
- testIB3.c
: Que constatez vous lorsque vous exécutez plusieurs
fois le programme de la question 2 ? Pour remédier à ce problème, écrivez un
programme avec le même comportement que le précédent mais qui de plus garantit
que le père attend la fin de l'exécution de son fils avant d'invoquer une
fonction d'affichage.
Écrire un source C qui se dédouble et pour lequel :
Lors du TD-machine 1 de l'unité de systèmes d'exploitation, vous avez implémenté une bibliothèque permettant de lire et écrire des lignes dans un fichier. Vous avez ainsi du obtenir deux fichiers sources qui ressemblent fortement à ceux-ci : gestionFichiers.c et gestionFichiers.h . Dans cet exercice, nous allons utiliser cette bibliothèque afin de tester la sémantique de partage des fichiers entre un processus père et ses fils sous les systèmes LINUX de l'ESIEE.
A - Pour cela, vous implémenterez trois fonctions main dans trois fichiers C distincts.
- testIII1.c
: Un programme qui se
dédouble, puis pour lequel chacun des deux processus ouvre le fichier donné ici,
y lit une ligne et ferme le fichier.
- testIII2.c
: Un programme qui ouvre le fichier, se dédouble,
puis pour lequel chacun des deux processus lit une ligne dans le fichier et le
ferme.
- testIII3.c
: Un programme réalisant les mêmes opérations qu'à la
question précédente mais pour lequel l'utilisateur peut spécifier au lancement
via la ligne de commande le nom du fichier texte dans lequel il faut lire. Pour
récupérer les arguments d'un programme en C vous devez utiliser les arguments
int argc et char **argv passé à la fonction main (voir par exemple main).
B - La position de lecture dans un fichier est-elle
toujours partagée, toujours commune entre un père et son fils ? Discutez entre
vous des différents cas possibles ? Est-ce cohérent avec ce que vous avez vu en
cours ? Modifiez le programme du fichier testIII3.c
de telle sorte
que le processus fils lise toujours la première ligne du fichier et le père la
seconde.
Ce sujet a été élaboré par Jean COUSTY et
Laurent NAJMAN
Laboratoire d'Informatique Gaspard-Monge, Université Paris-Est - Département
Informatique, ESIEE Paris