Sujet de TP
Transcription
Sujet de TP
Travaux pratiques de programmation parallèle 2010-2011 1. Écrire une fonction Erreur permettant d’afficher la cause de l’échec de l’appel à une primitive UNIX précédé d’un message donné par l’utilisateur puis quitte le programme en cours. Afin de pouvoir l’utiliser dans les programmes écrits en TP, encapsuler cette fonction dans un fichier de spécification (erreur.h). Note : pour les exercices suivants, vous utiliserez impérativement un fichier Makefile. 2. Écrire une commande qui permet de créer un fichier uniquement si le nom de fichier n’est pas déjà utilisé et d’écrire le nom du fichier en tête du fichier. Cette commande sera paramétrée par le nom du fichier que l’on désire créer et utilisera obligatoirement l’appel système open. 3. Écrire une fonction Afficher permettant d’afficher le contenu d’un fichier, fichier désigné par son nom externe dans le système, dans la sortie standard de l’application (entrée n˚1 de la table des fichiers ouverts). Un contrôle doit être effectué sur l’existence du fichier source. Écrire ensuite un programme de test de cette fonction en utilisant la notion de fichier de spécification (afficher.h). 4. On souhaite écrire trois versions d’un programme C dans lequel un processus crée N processus (N < 5). Chaque processus fils doit s’identifier et donner ses caractéristiques grâce aux primitives suivantes : getpid() getppid() getgid() getegid() getuid() geteuid() : : : : : : identificateur de processus identificateur de processus père numéro de groupe réel numéro de groupe effectif numéro de l’utilisateur qui exécute le processus (utilisateur réel) numéro d’utilisateur effectif. (a) On veut que les N fils s’exécutent en parallèle. (b) Modifier le programme précédent pour que les N fils s’exécutent l’un après l’autre. (c) Modifier le cas (a) pour que le processus père connaisse et affiche la manière dont chacun de ses fils a terminé son exécution ? 5. Écrire un programme qui effectue la combinaison ps -al ; date en respectant la séquentialité : – un processus fils réalisera la commande ps ; – le processus père effectuera l’appel à la commande date. 6. Écrire la commande moncat en prenant en compte une éventuelle redirection (utilisez la fonction afficher. Exemple : moncat fichier1 fichier2 fichier3 ">" fichier destination Pour tester, tapez le signe de redirection encadré par des guillemets. Voire le manuel de string.h pour les comparaisons de chaı̂nes. 7. Écrire une commande Compiler définie de la manière suivante : Compiler fich1.c fich2.c fich3.c ... fichn.c Cette commande permet dans un premier temps de réaliser, en parallèle, la compilation des fichiers spécifiés pour générer fich1.o . . . fichn.o. Pour chacune de ces compilation on redirigera la sortie erreur sur un fichier erreur (pour fichi.c le fichier sera fichi.err). Dans le cas où la compilation de tous ces fichiers est correcte, l’édition de liens doit être immédiatement effectuée afin de créer le fichier exécutable a.out. Dans le cas où la compilation d’un fichier provoque une erreur, on affichera, pour chaque fichier erroné, le nom du fichier source C, ainsi que le nom du fichier où sont placées les erreurs. Afin de déduire le nom du fichier d’erreur d’après celui du fichier compilé, écrire une fonction FichierErreur telle que : char *FichierErreur(char *NomFichierSource) ; 8. Écrire un programme qui boucle et qui ne peut être détruit qu’après avoir reçu 10 caractères CTRL C. Faire cet exercice d’abord en utilisant la primitive signal puis le refaire en utilisant la primitive sigaction. 9. Écrire un programme dans lequel un processus et son fils se synchronisent en utilisant les signaux pour écrire, à tour de rôle, un message personnalisé sur la sortie standard. 10. Écrire une commande purifier paramétrée par un nom de fichier qui enlève les voyelles d’un texte entré au clavier. Le processus père sera chargé de collecter le message écrit au clavier (terminaison CTRL D) et le communiquera à son fils en utilisant un tube de communication. Le processus fils sauvera alors ce message dans le fichier dont le nom sera passé en argument. Le père attendra l’envoi du message pour signifier que la commande s’est bien déroulée. Remarque : pour enlever les voyelles, vous pouvez utiliser tr. 11. On se propose de simuler une chaı̂ne de fabrication d’un certain type de produit. Cette chaı̂ne est composée de 4 processus ouvrier qui travaillent en parallèle sur des produits différents. Le premier processus ouvrier est chargé de recevoir une requête de la part d’un processus client et ensuite de mettre en œuvre une session de fabrication du produit en donnant les caractéristiques de la commande au deuxième ouvrier de la chaı̂ne. Chaque ouvrier qui a terminé passe le produit au processus ouvrier suivant. Chaque ouvrier tient compte du travail du précédent qui lui est indiqué par un code sur un entier. Quand le produit arrive au dernier ouvrier celui dernier prévient par le signal SIGUSR1 lu client qu’il peut venir chercher son produit. (a) Donner un schéma des communications entre les différents processus et les structures de données nécessaires. (b) Écrire les processus ouvrier. (c) Écrire un processus client de type 1 avec comme contrainte : le client commande NB PROD1 produits et attend la fin de la fabrication d’un produit pour commander le suivant. (d) Écrire un processus client de type 2 avec comme contrainte : le client commande NB PROD2 produits et n’attend pas la fin de la fabrication d’un produit pour commander le suivant. (e) Écrire le programme principal de cette application comportant 4 ouvriers et NB CLIENTS1 clients de type 1 et NB CLIENTS2 de type 2. 12. On se propose de concevoir une application dans laquelle interviennent des robots mobiles au sein d’un environnement. Ces robots se déplacent dans un plan selon 4 directions (sud, nord, est, ouest). Le contrôle du déplacement des robots pour éviter les collisions est centralisé dans un processus Environnement. Le processus Environnement reçoit de la part de chaque robot la position où celui-ci souhaite se rendre. Si le déplacement est possible (dans les limites de l’environnement et ne provoque pas de collisions entre robots), il en avertit le robot par l’émission de SIGUSR1. Dans le cas contraire, c’est le signal SIGUSR2 qui est envoyé. L’environnement est matérialisé par une matrice que vous afficherez avec les robots. Chaque processus Robot a pour fonction essentielle d’explorer l’environnement en se déplaçant. La fonction : void Explore (int XCourant, int YCourant, int *XSouhaite, int *YSouhaite) ; qui, à partir de la position courante du robot (XCourant, YCourant) déterminera, au hasard, la position où le robot doit aller (XSouhaite, YSouhaite). Pour changer effectivement de position, le robot attend l’autorisation de l’environnement. Si l’environnement ne valide pas le choix du robot, celui-ci propose une nouvelle position donnée par Explore. (a) Écrire les programmes des processus Environnement et Robot. (b) Écrire le programme principal initialisant cette application dans laquelle NB ROBOTS se déplacent.