/******************************************/
/*                                        */
/*  Prof. Dr. Carsten Vogt                */
/*  Fachhochschule Koeln                  */
/*  Fakultaet 07, Nachrichtentechnik      */
/*  http://www.nt.fh-koeln.de/vogt        */
/*                                        */
/*  UNIX-C-Schnittstelle:                 */
/*  Prozesskommunikation ueber            */
/*  Shared Memory.                        */
/*                                        */
/******************************************/

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>

main() {

 /* Vaterprozess bereitet die Kommunikation vor */

 int shmid; /* Identifikator des Shared-Memory-Segments */

 float *f_pointer;  /* Zeiger zum Zugriff auf das Segment,
   das als Folge von float-Zahlen interpretiert wird
   (siehe unten). */

 int i, status; /* Hilfsvariablen */
 float wert;

 /* Erzeugung eines Shared-Memory-Segments
    zur Aufnahme von fuenf float-Werten */

 shmid = shmget(IPC_PRIVATE,5*sizeof(float),IPC_CREAT|0777);
 
 if (fork()==0) {

  /* Sender-Prozess */

  /* Bindet Shared-Memory-Bereich bei sich ein:
     f_pointer zeigt dann auf den Anfang des Bereichs. */

  f_pointer = (float *) shmat(shmid,0,0);

  /* Schreibt die Wertfolge 0.0, 0.5, 1.0, 1.5, 2.0
     in das Segment */

  printf("\n");
  for (i=0;i<5;i++) { 
     wert = i/2.0;
     printf("Sender schreibt %.1f an Position %d\n",wert,i);
     *(f_pointer+i) = wert;
   }

  /* terminiert */

  exit(0);

 }

 if (fork()==0) {

  /* Empfaenger-Prozess */

  /* Bindet Shared-Memory-Bereich bei sich ein:
     f_pointer zeigt dann auf den Anfang des Bereichs. */

  f_pointer = (float *) shmat(shmid,0,0);

  /* Wartet eine gewisse Zeit */

  sleep(2);

  /* Liest Wertfolge aus dem Segment
     und gibt sie aus */

  printf("\n");
  for (i=0;i<5;i++) {
     wert = *(f_pointer+i);
     printf("Empfaenger liest %.1f aus Position %d\n",wert,i);
    }

  /* Terminiert */

  exit(0);

 }

 /* Vater wartet auf Ende der Soehne */

 wait(&status);
 wait(&status);

 /* Vater loescht Shared-Memory-Segment */

 shmctl(shmid,IPC_RMID,0);

}
