#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define PIPE_DATA_LENGTH 16

int main(int argc, char **argv)
{
  if(argc != 2) {
      printf("Das Programm benoetigt als Eingabe die Groesse der Matrix\n");
      return 1;
  }
  
  // Matrix erstellen
  int N = atoi(argv[1]);
  int matrix[N][N];
  printf("Seitenlänge N: %d\n", N);
  printf("Die Matrix: \n");
  for(int i = 0; i < N; i++) {
   for(int j = 0; j < N; j++) {
     matrix[i][j] = i;
     printf("%3d ", i);
   }
   printf("\n");
  }
  
  // Pipe erstellen
  int result_pipe[2];
  pipe(result_pipe);
  // Kinprozesse erstellen
  int pid = 0;
  for(int i = 0; i < N; i++) {
    pid = fork();
    if(pid == 0) {
      // Anfang des Kindprozesses
      printf("Kindprozess %i gestartet\n", i);
      int ergebnis = 0;
      for(int j = 0; j < N; j++) {
		ergebnis += matrix[j][i];
      }
      printf("Ergebnis von Kindprozess %i: %i\n", i, ergebnis);
      char ergebnis_char[PIPE_DATA_LENGTH];
      sprintf(ergebnis_char, "%d", ergebnis);
      write(result_pipe[1], ergebnis_char, PIPE_DATA_LENGTH);
      
      close(result_pipe[0]);
      close(result_pipe[1]);
      // Ende des Kindprozesses
      return 0; // <-- hier werden alle Kinderprozese beendet
    } 
  }
   
   // Elternprozess
  printf("Ich bin der Elternprozess und sammle die Daten ein\n");
  int ergebnis = 0;
  for(int i = 0; i < N; i++) {
    char ergebnis_char[PIPE_DATA_LENGTH];
    read(result_pipe[0], ergebnis_char,PIPE_DATA_LENGTH);
    int zwischenergebnis = atoi(ergebnis_char);
    //dprintf(zwischenergebnis, "%d", ergebnis_char);
    printf("%d", zwischenergebnis);
    if(i < N-1) {
     printf("+"); 
    }
    ergebnis += zwischenergebnis;
  }
  
  printf("\nDas Gesamtergebnis lautet: %d\n", ergebnis);
  close(result_pipe[0]);
  close(result_pipe[1]);  
  return 0;
}
