next up previous contents
Next: Die Ausgabe Up: Parallele Ausführung von Programmen Previous: Kompatibilität   Contents


Hallo, Welt!

Dieses kleine Master-Programm hello.c zeigt die wichtigsten Grundlagen der PVM-Programmierung. Zuerst gibt es mit pvm_mytid() seinen Task Identifier13 aus. Es startet jetzt mit der Funktion pvm_spawn() eine Kopie eines anderen Programmes, des Slave-Programmes (hello_other), auf einem Node. Wenn diese Funktion erfolgreich beendet wurde, wartet der Master nach dem Kommando pvm_recv() auf eine Antwort des Slaves. Nun gibt das Programm die Botschaft des anderen Programmes an der Konsole aus, welche mittels pvm_upkstr() aus der Message extrahiert wurde. Auch der Tid des anderen Tasks wird dabei ausgegeben. Dieser Vorgang wird wiederholt, solange i<=9 ist. Dadurch werden mehrere Tasks erzeugt, welche sich dann mit unterschiedlichen Tid's melden. Am Ende wird durch pvm_exit() das Programm vom PVM-System getrennt.

/*
   Program hello.c
*/

#include <stdio.h>
#include "pvm3.h"

main()
{  
   int cc[10], tid[10],i;
   char buf[10][100];

   printf("i'm t%x\n", pvm_mytid());
  
   for ( i=0; i<=9; i++ ){
      cc[i] = pvm_spawn("hello_other", (char**)0, 0, "", 1, &tid[i]);
      if (cc[i] == 1) {
         cc[i] = pvm_recv(-1, -1);
         pvm_bufinfo(cc[i], (int*)0, (int*)0, &tid[i]);
         pvm_upkstr(buf[i]);
         printf("from t%x: %s\n", tid[i], buf[i]);
      } else
      printf("can't start hello_other\n");
   }
   pvm_exit();
   exit(0);
}

Das Slave-Programm hello_other.c wird vom obigen Masterprogramm gestartet. Seine erste Handlung ist das Abfragen der Tid des Masterprozesses, die es via pvm_parent() erfährt. Danach fragt es den Hostnamen des Clients ab, auf dem es läuft, und überträgt ihn nach dem initialisieren des ``Send Buffers'' mit pvm_initsend() per pvm_send() zum Master. pvm_pkstr() platzierte den String im Sendepuffer.

/*
   Slave-Program hello_other.c
*/

#include "pvm3.h"

main()
{
   int ptid;
   char buf[100];

   ptid = pvm_parent();

   strcpy(buf, "hello, world from ");
   gethostname(buf + strlen(buf), 64);

   pvm_initsend(PvmDataDefault);
   pvm_pkstr(buf);
   pvm_send(ptid, 1);

   pvm_exit();
   exit(0);
}



Subsections
next up previous contents
Next: Die Ausgabe Up: Parallele Ausführung von Programmen Previous: Kompatibilität   Contents
Manfred Stock 2003-02-07