Mini-projet 1

Transcription

Mini-projet 1
Fondements des Systèmes d’Exploitation - Contrôle Continu
Mini-projet no 1
Principe
Ce mini-projet est à rendre durant la séance de TP prochaine. Lisez bien l’intégralité du sujet pour
respecter chaque point énoncé.
On désire simuler un ordonnancement de plusieurs processus. Écrivez un programme à qui l’on
transmet, en ligne de commande, un entier, un nom de fichier d’origine et un nom de fichier de destination. Le processus principal (père) va lire le fichier qu’on lui a transmis et le séparer en groupes
de n lignes, n étant l’entier fourni. Pour chacun de ces groupes de lignes, il va, avec fork(), créer un
processus fils, en lui fournissant son groupe de ligne et le nom du fichier de destination. Lorsque tous
les fils sont créés, il crée un fichier dont vous choisirez le nom - par exemple toto - dans lequel il place
le PID du premier fils. Puis il attend la terminaison de ses fils. Chaque fois que l’un d’eux est terminé,
il modifie toto pour y mettre le PID du prochain fils. Quand tous sont arrêtés, il s’arrête à son tour.
Chaque fils fonctionne ainsi: il vérifie l’existence du fichier toto et, le cas échéant, lit l’identifiant qui
s’y trouve. Si le fichier n’existe pas ou si l’identifiant n’est pas le sien, il s’endort pendant une seconde
à l’aide de la primitive sleep(int). Sinon, il affiche à l’écran son groupe de lignes et le concatène
également au fichier destination, le créant le cas échéant. Lorsque ceci est fait, il s’arrête.
Exemple d’exéction
dupont@turing ~ $ more lyrics
lyrics: No such file or directory
dupont@turing ~ $ ./ordonne 4 leforestier lyrics
Père: lecture du fichier "leforestier" et séparation en groupe de 4 ligne(s)
Fils 15218: le fichier "toto" n’existe pas. Je me rendors.
Père: création d’un fils. Son PID est 15218.
Père: création d’un fils. Son PID est 15219.
Père: création d’un fils. Son PID est 15221.
Fils 15221: le fichier "toto" n’existe pas. Je me rendors.
Fils 15219: le fichier "toto" n’existe pas. Je me rendors.
Père: 3 fils créé(s). Création du fichier "toto" qui contient:
15218
Fils 15218: le fichier "toto" contient mon PID. Je copie dans "lyrics" le texte :
C’est une maison bleue
Adossée à la colline
On y vient à pied, on ne frappe pas
Ceux qui vivent là, ont jeté la clé
Père: le fils 15218 a terminé. Modification de "toto" qui contient:
15219
Fils 15221: le fichier "toto" ne contient pas mon PID. Je me rendors.
Fils 15219: le fichier "toto" contient mon PID. Je copie dans "lyrics" le texte :
On se retrouve ensemble
Après des années de route
Et l’on vient s’asseoir autour du repas
Tout le monde est là, à cinq heures du soir
Fils 15221: le fichier "toto" ne contient pas mon PID. Je me rendors.
Père: le fils 15219 a terminé. Modification de "toto" qui contient:
15221
Fils 15221: le fichier "toto" contient mon PID. Je copie dans "lyrics" le texte:
San Francisco s’embrume
San Francisco s’allume
San Francisco, où ^
etes vous
Liza et Luc, Sylvia, attendez-moi
Père: il n’y a plus de fils. Je supprime toto. Au revoir.
dupont@turing ~ $ more lyrics
C’est une maison bleue
Adossée à la colline
On y vient à pied, on ne frappe pas
Ceux qui vivent là, ont jeté la clé
On se retrouve ensemble
Après des années de route
Et l’on vient s’asseoir autour du repas
Tout le monde est là, à cinq heures du soir
San Francisco s’embrume
San Francisco s’allume
San Francisco, où ^
etes vous
Liza et Luc, Sylvia, attendez-moi
dupont@turing ~ $ diff lyrics leforestier
dupont@turing ~ $ more toto
toto: No such file or directory
Vous n’êtes pas obligés d’afficher autant de messages au fur et à mesure de l’exécution. Il y en a
beaucoup dans l’exemple pour que vous puissiez suivre le déroulement. Gardez en tête que ceci est
un ordre d’exécution possible mais que le système d’exploitation aurait pu choisir un tout autre ordre.
L’utilisation du fichier toto, cependant, assure que les recopies auront bien lieu dans le bon ordre.
Étapes
Pour programmer ce qui vous est demandé, il est conseillé de suivre les étapes suivantes.
Fonctions utiles au père
• int read_x_lines(FILE *file, char **buffer, int x);
Cette fonction lit x lignes (sauf s’il n’y en a plus assez) dans le fichier file (jusqu’à un ’\n’)
et les place dans un tampon. La fonction appelante y aura accès à travers buffer. Le caractère
’\n’ est également ajouté dans le tampon. La fonction renvoie le nombre de lignes lues ;
• int create_new_child(char *text, char *filename);
Cette fonction crée un nouveau processus fils en lui transmettant une chaı̂ne de caractères qu’il
devra afficher quand ce sera son tour et un nom de fichier dans lequel il écrira. Cette fonction
renvoie le PID du nouveau fils pour pouvoir le stocker (il est également envisageable de passer un
tableau ou une liste en argument pour stocker directement le nouveau PID) ;
• int *read_file_and_create_childs(char *srcname, char *dstname, int x, int *nbprocs);
Cette fonction, en utilisant notamment les deux fonctions ci-dessus, lit le fichier dstname par
tranches de x lignes et, pour chacune de ces tranches, crée un processus fils en lui transmettant
ses lignes et dstname. Elle renvoie un tableau contenant la liste des PID des processus fils créés
et dont la taille est stockée dans *nbprocs (vous pouvez remplacer ce tableau par une autre
structure de donnée si elle vous parait plus appropriée) ;
• void next_child_must_sing(int pid);
Cette fonction remplace le contenu du fichier de communication (toto dans l’exemple) par l’entier
pid. Vous pouvez décider de l’écrire sous forme d’entier ou sous forme de chaı̂ne de caractères.
2
Fonctions utiles au fils
• int check_if_it_is_my_turn();
Cette fonction vérifie si le fichier de communication (toto dans l’exemple) existe et, si oui, s’il
contient le PID du processus. Si ces deux conditions sont remplies, la fonction renvoie 0 et 1
sinon. Cette fonction sera appelée dans une boucle qui continuera tant que 0 n’est pas renvoyé
et qui, à chaque tour de boucle, s’endort par exemple avec la fonction sleep() ;
• sing(char *text, char *filename);
Cette fonction imprime à l’écran la chaı̂ne text et la concatène au fichier filename, le créant
si nécessaire. Le fichier est refermé après l’appel à la fonction. Après avoir appelé sing(), le
processus fils peut se terminer.
Bravo, vous venez de simuler un mécanisme d’IPC !
Archive
Vous rendrez le source de votre programme dans une archive au format tgz portant votre nom et
contenant un répertoire à votre nom.
Par exemple:
dupont@turing ~ $ mkdir dupont
dupont@turing ~ $ cp maxime.c dupont/
dupont@turing ~ $ tar -czf dupont.tgz dupont/
3

Documents pareils