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. |