All pastes #773623 Raw Edit

Jemand

public text v1 · immutable
·published 2007-11-14 17:51 UTC
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;
}