# Semaphor und Shared Memory Problem



## isabellakarst (2. Mai 2004)

Hallo an alle!

Ich habe eine mir unlösbare aufgabe bekommen:
Ich soll 3 Prozesse programmieren, die über einen shared memory miteinander kommunizieren. Außerdem soll das ganze nach einer bestimmten Reihenfolge ablaufen - die über Semaphore geregelt werden soll. 

Ich habe bereits diese 3 Prozessansätze:

PROZESS 1:

```
//*********************************************************************************

//

//                                   I know you guess

//                Isabella Karst, Simone Lilg, Daniela Paulnsteiner

//
//*********************************************************************************




#include "ikyg.h"
#define SEM_NR 1                 //Anzahl der Semaphore

#define KEY 0x12345              //Schlüssel für Semaphor (privat)

#define PERMISSION 0660

int seminit(int,char);
void main ()
{

//---------------------------------PROZESSE---------------------------------------------

int pid_IO;
int pid_LOG;
pid_LOG = fork();
pid_IO = fork();


//-------------------------INITIALISIEREN DES SEMAPHORS--------------------------------


int seminit(int argc, char **argv)
{
    int semid;
    if((semid = semget (KEY, SEM_NR, IPC_CREAT|PERMISSION)) < 0)
    {
        (void) fprintf (stderr, "%s: Fehler beim Erstellen des Semaphors: %s", argv[0], stderr(errno));
    }
}


//-----------------------------------SHARED MEMORY--------------------------------------
//int *data;
int shmid;
//int i;
//double j;
//int k[BUFSIZE];
//int Gzahl;


if(shmid = shmget (KEY, BUFSIZE * sizeof(int), IPC_CREAT | PERMISSION)) < 0)
{
    (void) fprintf(stderr, "%s: Fehler beim Erzeugen des Shared Memory: %s", argv[0], strerror(errno));

}


//---------------------------------ZUFALLSGENERATOR-------------------------------------


randomize();
zahl=rand()%100;


//................................Lesen aus Shared Memory...............................


if((shmid =shmget (KEY, BUFSIZE * sizeof (int), IPC_CREAT | PERMISSION)) <0)
   {
      (void) fprintf (stderr, "%s: Fehler beim Shared Memory: %s", argv[0], strerror(errno));
   }

   if((data = (int *) shmat (shmid, NULL, 0)) == (int*) -1)
   {
      (void) fprintf (stderr, "%s: Fehler beim anhängen an den Shared Memory: %s", argv[0], strerror(errno));
   }

   do{
      for( i= 0; i<BUFSIZE; i++) {
           Gzahl = data;
           printf("\nWert: %d\n", data[i]);
      }
   }
   while (*data != END_SIGNAL);


//********************************** zahl vergleichen *************************************************

   if(Gzahl<Zahl)
   {printf("\nIhre Zahl ist zu klein, bitte eine groessere eingeben!\n");

        //..............................Schreiben in  Shared Memory...............................

      {
         (void) fprintf(stderr, "%s: Fehler beim Shared Memory: %s", argv[0], strerror(errno));
       }


      //... ... ... ... ... ... shared memory schreiben ... ... ... ... ... ... ... ...

      pid_IO = getpid();
      for(j=0; j< 500000; j++)
          {
           for(i=0; i< BUFSIZE; i++)
          {
       data = 1;
       }
      }
      *data = END_SIGNAL;

}

   if(Gzahl>Zahl)
   {printf("\nIhre Zahl ist zu gross, bitte eine kleinere eingeben!\n");

        //..............................Schreiben in  Shared Memory...............................

     if((data = (int *) shmat (shmid, NULL, 0)) == (int *) -1)
      {
       (void) fprintf(stderr, "%s: Fehler beim Shared Memory: %s", argv[0], strerror(errno));

      }


      //... ... ... ... ... ... shared memory schreiben ... ... ... ... ... ... ... ...


      pid_IO = getpid();
      for(j=0; j< 500000; j++)
      {
         for(i=0; i< BUFSIZE; i++)
           {
              data = 1;
           }

      }
      *data = END_SIGNAL;

}

   if(Gzahl==Zahl)
   {printf("\n! Sie haben die Zahl erraten !\n");}

}
```





PROZESS 2


```
//*********************************************************************************

//

// 
                                 Logik / Statistik

//                Isabella Karst, Simone Lilg, Daniela Paulnsteiner

//

//*********************************************************************************



#include "log.h"



#define SEM_NR 1 		//Anzahl der Semaphore

#define KEY 0x12345		//Schlüssel für Semaphor (privat)

#define PERMISSION 0660


int shmget ();

int seminit(int,char);

int shmid;

int BUFSIZE;

char argv;

int *data;

int a,i;

int versuche;



//----------------------------------LOG PROZESS------------------------------------------

//................................Lesen aus Shared Memory...............................

 

int main(void)

{

   /*if((shmid =shmget (KEY, BUFSIZE * sizeof (int), IPC_CREAT | PERMISSION)) <0)   
     {
      (void) fprintf (stderr, "%s: Fehler beim Shared Memory: %s", argv[0], strerror(errno));

   }
     if((data = (int *) shmat (shmid, NULL, 0)) == (int*) -1)
   
       {
      
          (void) fprintf (stderr, "%s: Fehler beim anhängen an den Shared Memory: %s", argv[0], strerror(errno));
   }
  
 */

   do{
      for( i= 0; i<BUFSIZE; i++) {
           a = data;
           printf("\n Wert: %d \n", data);
      }
   }
   while (*data != END_SIGNAL);



versuche=versuche+a;

printf("\nDas war ihr %dter Versuch", versuche);

if(versuche>10)
{printf("\nSie sind schlecht!");}

if(versuche>20)
{printf("\nSie sind dumm!");}



}
```


PROZESS 3:


```
//*********************************************************************************
//
//                            Eingabe und Ausgabe Prozess
//                Isabella Karst, Simone Lilg, Daniela Paulnsteiner
//
//*********************************************************************************


#include "io.h"

void io()
{
   int Gzahl;   

   printf("*** Willkommen bei diesem Ratespielchen! ***\n");


do{
   printf("\n Bitte geben Sie eine Zahl zwischen 0 und 100 ein: \n");
   scanf("%s", &Gzahl);


//..............................Schreiben in  Shared Memory...............................


   if((data = (int *) shmat (shmid, NULL, 0)) == (int *) -1)
   {
	(void) fprintf(stderr, "%s: Fehler beim Shared Memory: %s", argv[0], strerror(errno));
	exit(1);
   }

   pid_IO = getpid();
   for(j=0; j< 500000; j++)
   {
	for(i=0; i< BUFSIZE; i++)
	{
	    data = Gzahl;
	}
   }
   *data = END_SIGNAL;
}


//................................Lesen aus Shared Memory...............................

   
if((shmid =shmget (KEY, BUFSIZE * sizeof (int), IPC_CREAT | PERMISSION)) <0)
   {
      (void) fprintf (stderr, "%s: Fehler beim Shared Memory: %s", argv[0], strerror(errno));
      exit(1);
   }

   if((data = (int *) shmat (shmid, NULL, 0)) == (int*) -1)
   {
      (void) fprintf (stderr, "%s: Fehler beim anhängen an den Shared Memory: %s", argv[0], strerror(errno));
      exit(1);
   }
   
   do{
      for( i= 0; i<BUFSIZE; i++) {
           k = data;
	   printf("\nWert: %d\n", data);
      }
   }
   while (*data != END_SIGNAL);


}while(k==1)
```


HEADERFILE:

#include <stdio.h>
#include <conio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>


void log(void);
void io(void);

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Warum funktioniert die Kommunikation der Prozesse auf Knoppix nicht?

Bitte helft mir!

Danke Isabella


----------



## Daniel Toplak (2. Mai 2004)

*Hm* das ist ein schwieriges Thema, ich hab mir jetzt deinen Code nicht angesehen, da ich noch nie was mit SharedMemory, bzw. Semphore unter Unix gemacht habe.
Aber evtl. kann dir das hier weiter helfen:
http://www.mathe2.uni-bayreuth.de/axel/unix_system_programmierung.html
Dort gibt es etwas zu Semaphore.
Ansonsten such mal etwas zu UNIX-Systemprogrammierung.
Funktoniert, der Code nur unter Knoppix nicht, oder allgemein nicht unter Linux/UNIX?
Versuche mal den Fehler etwas mehr einzugrenzen, bzw. zu beschreiben, was genau funktioniert nicht?

Und bitte verwende CODE-Tags !

Gruß Homer


----------



## isabellakarst (2. Mai 2004)

Ich bekomme unerklärliche Syntaxfehler 

z.B. will mein Knoppix beim kompilieren den einfachen exit Befehl nicht

außerdem unverständliche Sytaxfehler vor "printf" obwohl die Zeile vorher orddnungsgemäß mit einem ";" abgeschlossen wurde ...


----------



## Daniel Toplak (2. Mai 2004)

> z.B. will mein Knoppix beim kompilieren den einfachen exit Befehl nicht    außerdem unverständliche Sytaxfehler vor "printf" obwohl die Zeile vorher orddnungsgemäß mit einem ";" abgeschlossen wurde ...


Gib mal bitte die genaue Fehlermeldung von gcc an, und an die zugehörige Stelle im Code.

Gruß Homer


----------



## basd (2. Mai 2004)

Zeige mal die printf Zeile

Sind deine Include Pfade richtig gesetzt


----------

