next up previous contents
Next: Debugger sous PVM Up: Prise en main rapide Previous: Mécanisme de communication

Exemple d'utilisation de PVM

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 $(+, -, \times, /)$ 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