Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » speisende Philosophen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.06.2008, 19:57 Uhr
gianna



Hallo,
bin neu hier und auch nicht sehr erfahren mit C, brauche dringend Hilfe.
Wir haben eine Aufgabe bekommen, in der es um die speisenden Philosophen geht,kennt vlt der ein oder andere?
es soll zunächst ein prozess Zeus erzeugt werden, der daraufhin 5 philosophen erzeugt, die zahl soll vordefiniert gespeichert werden, dann sollen die philosophen sich an einen tisch setzen und dort wollen sie essen, sie haben 3 zustände: denken, essen, warten. um zu essen müssen sie ihre linke und rechte gabel nacheinander aufnehmen die linke istwho+1)%ANZAHL_PHILOSOPHEN: who ist jeweils die nummer des philosophs. wir sollen nun mit semaphoren arbeiten uind hierbei ist jetzt ziel,dass ein deadlock entsteht und dann zeus einen kindprozess killt.
bei teil b:soll zeus nun die zustände der philosophen abfragen können und dem deadlock vorbeugen.

also das programm scheint meiner meinung nach zu stimmen,aber es läuft nicht, wäre lieb,wenn mir jemand helfen kann
so mein quellcode sieht nun so aus:

C++:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/sem.h>
#include <sys/ipc.h>

#define KEY 0xcaffee
#define RIGHTS 0600
#define ANZAHL_PHILOSOPHEN 5


/* Metohden um semaphoren zu inkrementieren  /dekrementieren, wenn ein Phil. stirbt, müssen die Gabeln wieder freigegeben werden also p anwenden */
void increment(int semid, int num)
{
     struct sembuf sop; /* Semaphor 0 */
     sop.sem_num = num;
     sop.sem_flg = SEM_UNDO;
     sop.sem_op = 1; /* Inkrement */
     if(semop(semid, &sop, 1) == -1)
    {
            perror("semop v"); exit(-1);
        }
}
void decrement(int semid, int num)
{
     struct sembuf sop;
     sop.sem_num = num; /* Semaphor 0 */
     sop.sem_flg = SEM_UNDO; /
     sop.sem_op = -1; /* Dekrement */
     if(semop(semid, &sop, 1) == -1) {
          perror("semop p"); exit(-1);
     }
}

/* denken: ka: irgendne Ausgabe ahhh ich denke und man muss in die Liste schreiben f�r Zeus: phil nr bla ist in Zustand 1: denken*/
void think (int who)
{
   printf("Philosoph %d denkt nun\n", who);        
          
   sleep(3);        
}
/* gleiches f�r essen*/

void eat (int who)
{
     printf("Philosoph %d isst nun\n", who);
    
     sleep(1);
}

/* gabel greifen, erst die linke,dann rechte */
void grab (int who)
{
     printf("Philosoph %d wartet auf seine linke Gabel\n", who);    
     decrement (who, (who+1)%ANZAHL_PHILOSOPHEN);
     printf("Philosoph %d hat seine linke Gabel genommen\n", who);
    
     sleep(1);
    
     printf("Philosoph %d wartet auf seine rechte Gabel\n", who);
     decrement (who, who);
     printf("Philosoph %d hat seine rechte Gabel genommen\n", who);
}

/* gabel fallen lassen, jetzt kann sie wieder benutzt werden */
void drop (int who)
{
          printf("Philosoph %d legt die Gabeln weg\n", who);
          increment (who, who);
          increment (who, (who+1)%ANZAHL_PHILOSOPHEN);

}

/* das macht jeder Philosoph, who bezeichnet die nr des phil. also 1-5; der will erst denken, dann nimmt er die gabeln, dann isst er, dann l�sst er sie fallen*/
void phil (int who)
{
     while (1)
     {
               think(who);
               grab(who);
               eat(who);
               drop(who);
     }
}


/* nur Methoden zum erzeugen von semaphormenge und �berpr�fen ob die exisitert */

int main() {
    /* Variablendeklarationen */
    pid_t retval;
    int i;
    int semid = 0;

    semid = semget(KEY, 0, 0);
    if (semid < 0)
    {
        printf("Creating new fork semaphores.\n");
        semid = semget(KEY, ANZAHL_PHILOSOPHEN, IPC_EXCL|IPC_CREAT|RIGHTS);
        if (semid < 0)
        {
            perror ("semget");
            return -1;
        }
        
        /* Die Gabel-Sems bekommen initial den Wert 1 zugewiesen. */
        for (i=0;i<ANZAHL_PHILOSOPHEN;i++) {
            semctl(semid, i, SETVAL, (int)1);
        }
   }
   printf("Die Philosophen werden erzeugt!\n");
   for (i=0;i<ANZAHL_PHILOSOPHEN;i++)
   {
       retval = fork();    

       switch (retval)
       {

           case -1:     perror ("FATAL ERROR! fork failure."); exit(EXIT_FAILURE);

           case 0:      phil (i);
                        
                        exit(1);
                        
           case 1:      sleep(60);

                        exit(1);

      }
   }

return 0;
}


Dieser Post wurde am 03.06.2008 um 11:47 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.06.2008, 09:58 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.06.2008, 17:11 Uhr
Int Main()



Hallo,

Insgesamt wäre es nett, wenn du genauer sagen würdest, was nicht läuft.
Mir ist aber beim ansehen aufgefallen, dass dein Programm nie die Funktion

void phil(int who) verlassen kann, da while(1) immer erfüllt ist.

Wenn das so gewollt ist, ist es okay. Aber dadurch wird auch nie der switch im int main durchlaufen, nachdem fork() einmal den Wert 0 hatte.

Abgesehen davon fehlt die Funktion fork().

int main

P.S.: Wenn man einzelne Funktionen während des Schreibens testet, ist das Fehlerfinden deutlich kürzer und einfacher.

P.S.S.: Wieso sind eigentlich alle Texte in Englisch?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.06.2008, 23:22 Uhr
Hans
Library Walker
(Operator)



Zitat von Int Main():
Abgesehen davon fehlt die Funktion fork().

Das ist doch unter Unix ein Systemaufruf, soweit ich weis...

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.06.2008, 03:08 Uhr
Pler
Einer von Vielen
(Operator)



Zitat von Hans:

Das ist doch unter Unix ein Systemaufruf, soweit ich weis...

Auch deshalb ist das eindeutig eine Systemprogrammierungsaufgabe.
-> Verschoben

P.S. Ein zweites P.S. müßte eher P.P.S heißen. ;-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: