Advertisement
kneefer

Mosix - AK

May 25th, 2015
358
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.36 KB | None | 0 0
  1. /* Szymon Bartnik grupa PSI sekja 9 */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <signal.h>
  6.  
  7. int main(int argc, char *argv[]) {
  8.  
  9.     int n;  // ilosc procesow potomnych
  10.     int s;  // ilosc silni do policzenia
  11.    
  12.     int inPipe[2], outPipe[2]; // potoki wejsciowy i wyjsciowy
  13.     int pid;                   // identyfikator biezacego procesu
  14.    
  15.     int partResult, result;    // wyniki silni
  16.    
  17.     int *childrenPids; // tablica dzieci do zabicia
  18.     int killError = 0; // czy byl blad zabijania dzieci
  19.    
  20.     int i; // zmienna tymczasowa do iterowania etc
  21.    
  22.     if(argc < 3){
  23.         perror("Za malo argumentow");
  24.         exit(0);
  25.     }
  26.    
  27.     n = atoi(argv[1]);
  28.     s = atoi(argv[2]);
  29.    
  30.     printf("Wejscie: %i procesy, %i silnie\n", n, s);
  31.    
  32.     printf("Alokacja tablicy na identyfikatory procesow\n");
  33.     childrenPids = (int*)malloc(n*sizeof(int));
  34.    
  35.     if(pipe(inPipe) < 0){
  36.         perror("Blad przy tworzeniu potoku wejsciowego");
  37.         exit(1);
  38.     }
  39.    
  40.     if(pipe(outPipe) < 0){
  41.         perror("Blad przy tworzeniu potoku wyjsciowego");
  42.         exit(1);
  43.     }
  44.    
  45.    
  46.     // spawnowanie dzieci
  47.     printf("Spawnowanie dzieci\n");
  48.    
  49.     for(i = 0; i<n; i++){
  50.        
  51.         if(((pid = fork()) < 0)){
  52.             perror("Blad forkowania");
  53.             exit(1);
  54.         }
  55.  
  56.         if(pid == 0){
  57.             // jestesmy w procesie dziecka
  58.             printf("Stworzono dziecko\n");
  59.            
  60.             while(1){
  61.                 read(inPipe[0], &i, sizeof(i));
  62.                 i = calculateFactorial(i);
  63.                 write(outPipe[1], &i, sizeof(i));
  64.                 printf("Obliczono i odeslano wynik %i! w watku potomnym\n", i);
  65.             }
  66.            
  67.         } else childrenPids[i] = pid; // jestesmy w procesie rodzica
  68.     }
  69.    
  70.     // wysylanie danych do obliczen
  71.     printf("Wysylanie danych do obliczen\n");
  72.    
  73.     for(i=1; i<=s; ++i){
  74.         write(inPipe[1], &i, sizeof(i));
  75.         printf("Wyslano %i! do obliczen\n", i);
  76.     }
  77.    
  78.     // odbieranie danych obliczonych
  79.     printf("Odbieranie wynikow\n");
  80.    
  81.     for(i=1; i<=s; i++){
  82.         read(outPipe[0], &partResult, sizeof(partResult));
  83.         result += partResult;
  84.         printf("Wynik czastkowy (%i!): %i\n", i, partResult);
  85.     }
  86.    
  87.     // zabijanie zdieci
  88.     printf("Zabijanie dzieci\n");
  89.    
  90.     for(i = 0; i<n; i++){
  91.         if(kill(childrenPids[i], SIGTERM) != 0){
  92.             perror("Problem z zabiciem jednego z dzieci\n");
  93.             killError = 1;
  94.         }
  95.     }
  96.    
  97.     if(killError == 1) exit(1);
  98.    
  99.     printf("Pelny wynik (zsumowane silnie): %i\n", result);
  100.    
  101.     return 0;
  102. }
  103.  
  104. int calculateFactorial(int num){
  105.    
  106.     if(num == 1) return 1;
  107.     return num * calculateFactorial(num-1);
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement