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