Next: Debugger sous PVM
Up: Prise en main rapide
Previous: Mécanisme de communication
Voici un exemple très simple afin d'illustrer uniquement le mécanisme de communication développé par PVM. On se place dans le cas où l'on dispose de 2 machines: un maître (master) et un esclave (slave). Le maître après avoir saisi 2 entiers et une opération à effectuer
envoie ces 3 données au client qui effectue l'opération et lui envoie le résultat.
Code MAÎTRE
#include <stdio.h>
#include <pvm3.h>
void main(void)
{
int cc, tid, result;
/* tableau contenant les 2 operandes a envoyer */
int donnees[2];
char op;
/* tableau contenant la chaine de caracteres associee */
/* a l'operation a effectuer */
char operateur[2];
/* Saisie des donnees */
printf("Entrez la valeur de a: ");
scanf("%d", &donnees[0]);
printf("Entrez la valeur de b: ");
scanf("%d", &donnees[1]);
printf("Type d'operation: ");
scanf("\n%c",&op);
/* on construit a partir de ce caractere */
/* une chaine de caracteres (ajout de \0 a la fin) */
sprintf(operateur,"%c\0",op);
/* on lance l'execution du client */
/* et on recupere le TID du client */
cc = pvm_spawn("client", NULL, 1, "slave", 1, &tid);
if (cc == 1)
{
/* on inhibe la recuperation des sorties */
pvm_catchout(0);
/* on initialise le mecanisme d'expedition */
pvm_initsend(PvmDataDefault);
/* on transfert dans le buffer les 2 operandes */
pvm_pkint(donnees, 2, 1);
/* on envoie les donnees avec pour identificateur la valeur 1*/
pvm_send(tid, 1);
/* on transfert l'operation dans le buffer */
pvm_initsend(PvmDataDefault);
pvm_pkstr(operateur);
/* on envoie l'operation au client */
pvm_send(tid, 2);
/* le maitre se met alors en attente du resultat */
pvm_recv(tid, -1);
/* on decompresse le message recu */
pvm_upkint(&result, 1, 1);
printf("Le resultat de %d %c %d vaut %d\n",donnees[0], op,
donnees[1], result);
}
else
printf("impossible d'executer client\n");
pvm_exit();
exit(0);
}
CODE CLIENT
#include <stdio.h>
#include <pvm3.h>
void main(void)
{
int pid, result;
/* tableau contenant les 2 operandes a traiter */
int operandes[2];
/* chaine qui recevra l'operateur */
char operation[2];
char op;
/* on recupere le TID du maitre */
pid = pvm_parent();
/* attente de reception des operandes */
pvm_recv(pid, -1);
/* recuperation du message stocke dans le buffer */
pvm_upkint(operandes, 2 ,1);
/* attente de reception de l'operation */
pvm_recv(pid, -1);
pvm_upkstr(operation);
op = operation[0];
/* calcul */
switch(op)
{
case '+': result = operandes[0] + operandes[1];break;
case '-': result = operandes[0] - operandes[1];break;
case '/': result = operandes[0] / operandes[1];break;
case 'X': result = operandes[0] * operandes[1];break;
}
/* on initialise le mecanisme d'expedition */
pvm_initsend(PvmDataDefault);
/* on envoie dans le buffer, le resultat de l'operation */
pvm_pkint(&result, 1, 1);
pvm_send(pid, 1);
/* fin du travail */
pvm_exit();
exit(0);
}
Pascal Véron
1999-03-04