Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Agata Wrona
- * n procesow potomnych (parametr wywolania programu)
- * dwa potoki
- * pierwszy potok: wysylanie danych do procesow potomnych
- * drugi potok: odbieranie danych od proesow potomnych
- * Proces rodzica wysyla do potoku zestaw liczb
- * Procesy potomne odbieraja liczby, znajduja najwiekszy wspolny dzielnik danej liczby
- * i wysylaja wynik do rodzica drugim potokiem
- * Wszystkie obliczone liczby sa sumowane a wynik jest wyswietlany na ekranie
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- int maxDivisor(int num)
- {
- int i;
- for (i = num -1; i > 0; i--)
- {
- if (num % i == 0)
- {
- return i;
- }
- }
- return -1;
- }
- int main(int argc, char *argv[])
- {
- int process, num;
- if (argc < 2)
- {
- printf("Nie podano parametru wejsciowego mowiacego o ilosci procesow potomnych.\n");
- return 0;
- } else
- {
- sscanf(argv[1], "%d", &process);
- sscanf(argv[2], "%d", &num);
- printf("Procesy potomne: %d.\nIlosc liczb: %d\nLiczby: \n", process, num);
- int potok1[2], potok2[2], i, a, sum = 0, arr[num], r, loop, one = -1;
- pipe(potok1);
- pipe(potok2);
- srand(time(NULL));
- for (i = 0; i < num; i++)
- {
- arr[i] = rand() % 99 + 2;
- r = arr[i];
- printf("\t%d\n", arr[i]);
- write(potok1[1], &r, sizeof(r));
- }
- printf("Najwieksze dzielniki:\n");
- for (i = 0; i < process; i++)
- {
- write(potok1[1], &one, sizeof(one));
- }
- for (i = 0; i < process; i++)
- {
- if (fork() == 0)
- {
- while(1){
- read(potok1[0], &r, sizeof(r));
- if (r == -1)
- {
- exit(0);
- }
- a = maxDivisor(r),
- write(potok2[1], &a, sizeof(a));
- }
- }
- while(wait(0) > 0){}
- for (i = 0; i < num; i++)
- {
- read(potok2[0], &a, sizeof(a));
- sum += a;
- printf("\t\t\t%d\n", a);
- }
- printf("Suma najwiekszych calkowitych dzielnikow: %d\n", sum);
- return 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement