rendered paste body//Michael Richner 661904
//BS1 UEbung 5
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <sys/ipc.h> //für Shared-Memory
#include <sys/shm.h> //für Shared-Memory
#include <stdbool.h> //für boolean
//# include <sys/wait.h>
#define RED "\033[22;31m"
#define NORMAL "\033[00m"
int main(int argc, char **argv){
srand( (unsigned)time( NULL ) ); // Initialisiert den Random-Generator mit der akt. Zeit in Sek
int shmid; //Identifikator des Shared-Memory-Segments
int *f_pointer; //Zeiger zum Zugriff auf das Segment, das als Folge von int-Zahlen interpretiert wird
int i, wert; //Hilfsvariablen
// int status_1, status_2;
pid_t pid_2, pid_3; //Prozesse
//fuers aktive warten
bool flag0 = false, flag1 = false;
int turn = 0;
printf("[PID 1: %i, PPID 0: %i]\n", getpid(), getppid());
//Erzeugung eines Shared-Memory-Segments zur Aufnahme von 100 int-Werten
shmid = shmget(IPC_PRIVATE,100*sizeof(int),IPC_CREAT|0777);
pid_2 = fork();
switch(pid_2){
case 0: //Kindprozess 2
printf("[PID 2: %i, PPID 1: %i]\n", getpid(), getppid());
//Bindet Shared-Memory-Bereich bei sich ein. f_pointer zeigt dann auf den Anfang des Bereichs.
f_pointer = (int *) shmat(shmid,0,0);
//aktives warten mit Dekker-Algorithmus
flag0 = true;
while (flag1){
if (turn != 0){
flag0 = false;
while (turn != 0){}
flag0 = true;
}
}
// kritischer Abschnitt
turn = 1;
flag0 = false;
//Erzeuge 100 Zufallszahlen und schreibe sie in den Shared-Memory-Bereich
for (i=0;i<100;i++){
wert = random();
printf("[PID 2: %i] schreibt %i an Position %i\n", getpid(), wert, i);
*(f_pointer+i) = wert;
}
break;
case -1: //Fehler 2
printf("%sError PID_2%s\n", RED, NORMAL);
exit(1);
break;
default: //Elternprozess 2
// waitpid(pid_2, &status_1, 0);
pid_3 = fork();
switch(pid_3){
case 0: //Kindprozess3
printf("[PID 3: %i, PPID 1: %i]\n", getpid(), getppid());
//Bindet Shared-Memory-Bereich bei sich ein. f_pointer zeigt dann auf den Anfang des Bereichs.
f_pointer = (int *) shmat(shmid,0,0);
//aktives warten mit Dekker-Algorithmus
flag1 = true;
while (flag0){
if (turn != 1){
flag1 = false;
while (turn != 1){}
flag1 = true;
}
}
// kritischer Abschnitt
turn = 0;
flag1 = false;
//Liest 100 Zufallszahlen aus dem Shared-Memory
for (i=0;i<100;i++){
wert = *(f_pointer+i);
printf("[PID 3: %i] liest %i aus Position %i\n", getpid(), wert, i);
}
break;
case -1: //Fehler 3
printf("%sError PID_3%s\n", RED, NORMAL);
exit(1);
break;
default: //Elternprozess 3
//Vater loescht Shared-Memory-Segment
shmctl(shmid,IPC_RMID,0);
break;
}
break;
}
return 0;
}