All pastes #758717 Raw Edit

Unbenannt

public text v1 · immutable
·published 2007-11-02 14:15 UTC
rendered paste body
//Michael Richner 661904
//BS1 UEbung 3

# include <stdio.h>
# include <sys/types.h>
# include <unistd.h>
# include <sys/wait.h> 
# include <time.h>
# include <stdlib.h>
/*
# export GREEN="\033[00m\033[01;32m" //%s
# export RED="\033[00m\033[01;31m"
# export BLUE="\033[00m\033[01;34m"
# export MAGENTA="\033[00m\033[01;35m"
# export CYAN="\033[00m\033[01;36m"
# export NORMAL="\033[00m"
*/

int main(int argc, char **argv){
	srand( (unsigned)time( NULL ) ); // Initialisiert den Random-Generator mit der akt. Zeit in Sek
	pid_t pid_2, pid_3, pid_4, pid_5;
	time_t t;
	time_t buffer_1;
	int i; //Zaehler
	int deskr_1[2];
	int error_1 = pipe(deskr_1);
	
	printf("[PID 1: %i, PPID 0: %i] ", getpid(), getppid());	
	if(error_1 < 0){ //Ueberpruefe Deskriptor 2
		printf("Error Deskriptor 1\n");
		exit (1);
	}else
		printf("Pipe 1 ready\n");

//2
	pid_2 = fork();
	switch(pid_2){
		case 0: //Prozess 2
//1.0			printf("%i:deskr1_0:%i\n", getpid(), close(deskr_1[0]));
			close(deskr_1[0]);
//3			
			pid_3 = fork();
			switch(pid_3){
				case 0: //Prozess 3
//2.0					printf("%i:deskr2_0:%i\n", getpid(), close(deskr_2[0]));
					//close(deskr_2[0]);
					printf("[PID 3: %i, PPID 2: %i]\n", getpid(), getppid());
//5										
					pid_5 = fork();
					switch(pid_5){
						case 0: //Prozess 5
							time(&t);
							write(deskr_1[1],&t,sizeof(t)); //schreiben auf Pipe 1
							printf("[PID 5: %i, PPID 3: %i] Set Time\n", getpid(), getppid());
//1.1							printf("%i:deskr1_1:%i\n", getpid(), close(deskr_1[1]));
							close(deskr_1[1]);
							break;

						case -1: //Fehler 5
							printf("Error PID_5\n");
							exit(1);
							break;	

						default: //Elternprozess 5
							close(deskr_1[1]);
							break;
					}
					break;
				
				case -1: //Fehler 3
					printf("Error PID_3\n");
					exit(1);
					break;
				
				default: //Elternprozess 3
//4					
//1.1					printf("%i:deskr1_1:%i\n", getpid(), close(deskr_1[1]));
					close(deskr_1[1]);					
					
					int buffer_2[20];
					int deskr_2[2];
					int error_2 = pipe(deskr_2);
					
					printf("[PID 2: %i, PPID 1: %i] ", getpid(), getppid());			
					if(error_2 < 0){ //Ueberpruefe Deskriptor 2
						printf("Error Deskriptor 2\n");
						exit (1);
					}else
						printf("Pipe 2 ready\n");
			
					printf("[PID 2: %i, PPID 1: %i] ", getpid(), getppid());
					int number;
					for(i=0; i<20; ++i){ //RND von 1-99 und auf Pipe 2 schreiben
						number = 1 + random()%99;
						printf("%i ", number);
						write(deskr_2[1],&number,sizeof(int)); //schreiben auf Pipe 2
					}
//2.1			 		printf("\n%i:deskr2_1:%i\n", getpid(), close(deskr_2[1]));
					printf("\n");
					close(deskr_2[1]);
			
					
					pid_4 = fork();
					switch(pid_4){
						case 0: //Prozess 4
//1.1							printf("%i:deskr1_1:%i\n", getpid(), close(deskr_1[1]));
							close(deskr_1[1]);
							printf("[PID 4: %i, PPID 2: %i] Average: ", getpid(), getppid());
							read(deskr_2[0],&buffer_2,sizeof(int)*20); //lesen von Pipe 2
							int average = 0;
							for(i=0; i<20;i++){
								average += buffer_2[i];
							}
							printf("%i\n", average/20);
//2.0							printf("%i:deskr2_0:%i\n", getpid(), close(deskr_2[0]));
							close(deskr_2[0]);
							break;
							
						case -1: //Fehler 4
							printf("Error PID_4\n");
							exit(1);
							break;
							
						default: //Elternprozess 4
//2.0							printf("%i:deskr2_0:%i\n", getpid(), close(deskr_2[0]));
							close(deskr_2[0]);
							break;
					}
					break;
			}
			break;
		
		case -1: //Fehler 2
			printf("Error PID_2\n");
			exit(1);
			break;
		
		default: //Elternprozess von 2
			printf("[PID 1: %i, PPID 0: %i] ", getpid(), getppid());
			read(deskr_1[0],&buffer_1,sizeof(t)); //lesen von Pipe 1
			printf("%s", ctime(&buffer_1));
//1.0			printf("%i:deskr1_0:%i\n", getpid(), close(deskr_1[0]));
			close(deskr_1[0]);
			break;
	}
	
	return 0;
}