Advertisement
Guest User

AK zadanie1 MOSIX

a guest
May 25th, 2015
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.87 KB | None | 0 0
  1. /* Agata Wrona
  2.  * n procesow potomnych (parametr wywolania programu)
  3.  * dwa potoki
  4.  * pierwszy potok: wysylanie danych do procesow potomnych
  5.  * drugi potok: odbieranie danych od proesow potomnych
  6.  * Proces rodzica wysyla do potoku zestaw liczb
  7.  * Procesy potomne odbieraja liczby, znajduja najwiekszy wspolny dzielnik danej liczby
  8.  * i wysylaja wynik do rodzica drugim potokiem
  9.  * Wszystkie obliczone liczby sa sumowane a wynik jest wyswietlany na ekranie
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <time.h>
  15.  
  16. int maxDivisor(int num)
  17. {
  18.     int i;
  19.     for (i = num -1; i > 0; i--)
  20.     {
  21.         if (num % i == 0)
  22.         {
  23.             return i;
  24.         }
  25.     }
  26.     return -1;
  27. }
  28.  
  29. int main(int argc, char *argv[])
  30. {
  31.     int process, num;
  32.    
  33.     if (argc < 2)
  34.     {
  35.         printf("Nie podano parametru wejsciowego mowiacego o ilosci procesow potomnych.\n");
  36.         return 0;
  37.     } else
  38.     {
  39.         sscanf(argv[1], "%d", &process);
  40.         sscanf(argv[2], "%d", &num);
  41.         printf("Procesy potomne: %d.\nIlosc liczb: %d\nLiczby: \n", process, num);
  42.    
  43.         int potok1[2], potok2[2], i, a, sum = 0, arr[num], r, loop, one = -1;
  44.         pipe(potok1);
  45.         pipe(potok2);
  46.         srand(time(NULL));
  47.        
  48.         for (i = 0; i < num; i++)
  49.         {
  50.             arr[i] = rand() % 99 + 2;
  51.             r = arr[i];
  52.             printf("\t%d\n", arr[i]);
  53.             write(potok1[1], &r, sizeof(r));
  54.         }
  55.        
  56.         printf("Najwieksze dzielniki:\n");
  57.        
  58.         for (i = 0; i < process; i++)
  59.         {
  60.             write(potok1[1], &one, sizeof(one));
  61.         }
  62.        
  63.         for (i = 0; i < process; i++)
  64.         {
  65.             if (fork() == 0)
  66.             {
  67.                 while(1){
  68.                     read(potok1[0], &r, sizeof(r));
  69.                     if (r == -1)
  70.                     {
  71.                         exit(0);
  72.                     }
  73.                 a = maxDivisor(r),
  74.                 write(potok2[1], &a, sizeof(a));
  75.             }
  76.         }
  77.        
  78.         while(wait(0) > 0){}
  79.        
  80.         for (i = 0; i < num; i++)
  81.         {
  82.             read(potok2[0], &a, sizeof(a));
  83.             sum += a;
  84.             printf("\t\t\t%d\n", a);
  85.         }
  86.         printf("Suma najwiekszych calkowitych dzielnikow: %d\n", sum);
  87.        
  88.         return 0;
  89.     }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement