Sujet de TME pour la semaine 6 Tubes Olivier Marin 050907 2

Transcription

Sujet de TME pour la semaine 6 Tubes Olivier Marin 050907 2
TME 6 - Tubes
Sujet de TME pour la semaine 6
Tubes
Olivier Marin
050907
L’objectif de ce TME est de programmer une application de conversion de devises en
utilisant l’interface de programmation POSIX pour les tubes. Pour vous faciliter la vie, des
structures de données ainsi que des fonctions attenantes à la conversion de devises sont
mises à votre disposition dans les fichiers converters.h et converters.c en:
/Vrac/POSIX/2007oct/TME6
1. PIPE
Utilisation des appels système liés aux tubes anonymes:
pipe, close, read, write.
1.1.
Ecrire un programme single_converter qui convertit un montant, exprimé dans une devise
quelconque en des devises prédéfinies (cf. fichier converters.h), et affiche le résultat de la
conversion.
Les paramètres de conversion sont entrés par l’utilisateur comme arguments du programme
de conversion au format suivant :
single_converter <devise> <montant>
-
devise représente la devise source,
-
montant correspond au montant à convertir dans la devise cible.
Ce programme met en œuvre 2 processus :
Le processus père recueille les paramètres qui constituent la requête utilisateur, crée un fils
qui effectuera la conversion, puis attend le résultat en lecture dans un tube anonyme avant
de l'afficher.
Le processus fils effectue la conversion et transmet le résultat à son père au moyen d'un tube
anonyme.
Exemple de trace de résultat :
./single_converter CNY "100.0"
P1694> Converting CNY 100.000
Conversion for: CNY 100.000
EUR 9.7350
GBP 6.58476
USD 13.24448
JPY 1540.65536
CNY 100.000
2. MKFIFO
Utilisation des appels système liés aux tubes nommés :
mkfifo, unlink, open, close, read, write.
- 1 -
TME 6 - Tubes
2.1.
On se propose de reprendre l’exercice 1.1, avec pour différence que la conversion sera prise
en charge par un programme conversion_server qui boucle en attente de requêtes de
conversion, ces dernières lui étant soumises au moyen d'un programme conversion_client.
L’utilisateur doit pouvoir ouvrir deux fenêtres de terminal, et lancer un programme serveur
dans l’une puis un programme client dans l’autre.
Format des commandes de lancement :
conversion_server <nom_tube_requete> <nom_tube_reponse>
conversion_client <nom_tube_requete> <nom_tube_reponse> <devise> <montant>
-
nom_tube_requete contient le chemin du tube par lequel transitent les requêtes.
-
nom_tube_reponse contient le chemin du tube par lequel transitent les réponses
-
devise représente la devise source,
-
montant correspond au montant à convertir dans la devise cible.
Les paramètres entrés comme arguments de conversion_client sont transmis au serveur
au moyen d'un tube nommé. Le serveur effectue la conversion puis renvoie le résultat au
client au moyen d'un autre tube nommé. Enfin le client affiche le résultat reçu en réponse à sa
requête.
Lorsqu’il est interrompu, le serveur ferme les tubes nommés et les détruit.
3. FCNTL
Utilisation de l'appel système : fcntl.
3.1.
On désire maintenant paralléliser le traitement des conversions.
En reprenant l’exercice 2.1, il va s'agir ici de faire traiter par un processus distinct chaque
conversion dans une devise donnée. Le nouveau programme serveur, nommé
multi_converter, crée NB_CONVERTERS processus fils. Chacun de ces fils prend en charge la
conversion dans une devise convenue. A chaque réception de requête, le père distribue le
travail parmi ses fils au moyen de tubes anonymes. Lorsqu'un fils termine une conversion, il
renvoie le résultat au père au moyen d'un tube anonyme qui lui est alloué. Quand le père a
reçu le résultat de chacun de ses fils, il renvoie la réponse complète à son client.
Afin d'optimiser les performances du programme serveur, on tient à ce que les lectures de
résultats par le processus père se fassent en mode non-bloquant. Pour que cela fonctionne, à
chaque fois qu'un processus fils a fini d'écrire un résultat dans son tube de réponse, il envoie
un signal SIGUSR1 au père pour lui signifier qu'un résultat est disponible. Tant qu'il n'a pas
reçu ses NB_CONVERTERS résultats, le père se met en attente de signaux.
- 2 -
TME 6 – Tubes
ANNEXE : FICHIER CONVERTERS.H
/**** converters.h ****/
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
/* Nb de processus convertisseurs (exo 3) */
#define NB_CONVERTERS 5
/* Identifiant pour convertisseur d'euros */
#define EUR_CONV 0
/* Identifiant pour convertisseur de livres sterling */
#define GBP_CONV 1
/* Identifiant pour convertisseur de dollars US */
#define USD_CONV 2
/* Identifiant pour convertisseur de yens */
#define JPY_CONV 3
/* Identifiant pour convertisseur de yuans */
#define CNY_CONV 4
/* Taux de change euro du 04/09/07 17:40 */
#define EUR 1
/* Taux de change livre sterling */
#define GBP 0.6764
/* Taux de change dollar US */
#define USD 1.3605
/* Taux de change yen */
#define JPY 158.2592
/* Taux de change yuan */
#define CNY 10.2722
- 3 -
TME 6 – Tubes
/* Message de conversion.
Un client pour une conversion envoie un message contenant :
- son pid
- la devise d'origine
- le montant a convertir
Un convertisseur renvoie :
- son pid
- la devise cible
- le montant apres conversion */
typedef struct conv_msg {
pid_t pid_sender;
/* pid du processus emetteur */
char currency[3];
/* devise */
double amount;
/* montant */
} conversion_message;
/* Tableau de resultats de conversion (exos 2 et 3) */
typedef conversion_message results_array[NB_CONVERTERS];
/* Convertit d'une devise vers une autre.
input_currency :
devise d'origine
target_currency :
devise cible
input_amount :
montant a convertir */
double convert(char* input_currency,
char* target_currency,
double input_amount);
/* Traite une requete de conversion.
request :
requete
result :
resultat de la conversion
conv_nb :
numero de conversion ; definit la
identifiants en debut de fichier. */
devise
cible
;
cf.
void handle_conversion_request(conversion_message request,
conversion_message *result,
int conv_nb);
/* Affiche le contenu d'une reponse a une requete de conversion. (exos 2 et
3)
request :
requete d'origine
results_array :
tableau des resultats de conversion */
void display_results(conversion_message request, results_array results);
- 4 -