//Michael Richner 661904 //BS1 UEbung 5 #include #include #include #include #include #include //für Shared-Memory #include //für Shared-Memory #include //für boolean //# include #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; }