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;
}