#include // pid_t #include // atoi #include // scanf, printf, fprintf, snprintf #include // fork, execvp #include // wait #define MAXN (50) // Die Eingabematrizen A und B // im Format A[Zeile][Spalte] int A[MAXN][MAXN]; int B[MAXN][MAXN]; // Die zu berechnende Matrix E = A*B int E[MAXN][MAXN]; // Die Zuordnung Kind-PID -> Matrixeintrag pid_t children[MAXN][MAXN]; // Ein Puffer fuer die Argumente von vmult mit je max. 19 Zeichen, // genug fuer Integer-Werte char vmultbuffer[2*MAXN+2][20]; // Funktion, um eine Matrix von der Standardeingabe zu lesen void read_matrix(int *M, int spalten, int zeilen) { for(int i = 0; i 1) { maxchildren = atoi(argv[1]); } // Lies die Dimension der Matrix ein int scan = scanf("%d", &n); if(scan == 0) { fprintf(stderr, "Konnte die Dimension der Matrix nicht lesen!\n"); exit(1); } else if (scan == EOF) { perror("scanf"); exit(1); } // Lies die erste Matrix ein: read_matrix((int*)A, n, n); // Lies die zweite Matrix ein: read_matrix((int*)B, n, n); // Initialisiere E und children for(int z = 0; z 0 || jobs < n*n) { // Falls gerade ein Prozess frei und was zu tun ist, // weise neue Aufgabe zu if(currentchildren < maxchildren && jobs < n*n) { // Suche freien Eintrag auf sehr ineffektive Art und Weise - // O(n^2) in Laudau-Notation - fuer diese Aufgabe ist das aber schon OK int zfrei,sfrei; for(int z=0; z> 8) & 0xff; // Finde den passenden Eintrag zur PID auf sehr ineffektive Art und Weise - // O(n^2) in Laudau-Notation - fuer diese Aufgabe ist das aber schon OK int zeile, spalte; for(int z = 0; z