//Michael Richner 661904 //BS1 UEbung 3 # include # include # include # include # include # include /* # 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; }