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.