Advertisement
m4ly

MOSIX Zadanie 1

Apr 27th, 2014
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.54 KB | None | 0 0
  1. /**
  2. Dawid Mocek
  3. Sekcja 1
  4.  
  5. MOSIX Zadanie 1.
  6. W zadaniu należy stworzyć `n` procesów potomnych oraz dwa potoki (n podawane jako parametr
  7. wywołania programu). Jeden z potoków będzie służył do wysyłania danych do procesów potomnych,
  8. natomiast drugi - do odbierania. Proces rodzica będzie wysyłał do potoku zestaw liczb.
  9. Procesy potomne maja odbierać te liczby, znajdować największy całkowity dzielnik danej liczby oraz
  10. wysłać wynik do rodzica drugim potokiem. Proces rodzica po wysłaniu wszystkich liczb przechodzi w stan
  11. odbierania danych. Wszystkie obliczone liczby maja zostać zsumowane, a wynik końcowy ma być
  12. wyświetlony na ekranie.
  13. */
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <math.h>
  18. #include <signal.h>
  19. #include <unistd.h>
  20.  
  21. int main(int argc, char **argv)
  22. {
  23.  
  24.     int n = atoi(argv[1]);
  25.  
  26.     int liczby[10] = { 2, 5, 6, 10, 77, 89, 49, 27, 91, 68 };
  27.     int wartownik = 1337;
  28.  
  29.     int i = 0, j = 0, k = 0;
  30.     int pipefd[2];
  31.     int pipefd2[2];
  32.     int tmp;
  33.     int z;
  34.     int g;
  35.     int suma;
  36.  
  37.     pid_t cpid, fpid;
  38.     char buf;
  39.  
  40.     if(pipe(pipefd) == -1)  {
  41.         perror("Pipe error");
  42.         exit(EXIT_FAILURE);
  43.     }
  44.  
  45.     if(pipe(pipefd2) == -1)  {
  46.         perror("Pipe2 error");
  47.         exit(EXIT_FAILURE);
  48.     }
  49.  
  50.     for(i = 0; i < 10; i++)
  51.         write(pipefd[1], &liczby[i], sizeof(int));
  52.  
  53.     for(i = 0; i < 10; i++)
  54.         write(pipefd[1], &wartownik, sizeof(int));
  55.  
  56.     // close(pipefd[1]);
  57.  
  58.     for(i = 0; i < n; i++)
  59.     {
  60.         // Tworze dziecko
  61.         fpid = fork();
  62.  
  63.         // Sprawdzenie fpida
  64.         if(fpid == -1) { perror("Fork error"); exit(EXIT_FAILURE); }
  65.  
  66.  
  67.         if(fpid == 0) {
  68.                 // Czytamy liczbe do tmp
  69.             while(read(pipefd[0], &tmp, sizeof(int))) {
  70.                 // printf("TMP = %d\n", tmp);
  71.  
  72.                 if(tmp == wartownik)
  73.                     exit(EXIT_SUCCESS);
  74.  
  75.                 // Tu robie obliczenia
  76.                 for(g = tmp - 1; g >= 1; g--){
  77.                   if((tmp % g) == 0){
  78.                     break;
  79.                   }
  80.                 }
  81.                 //z = g;
  82.  
  83.                 // Zapisuje do do pipefd[1]
  84.                 write(pipefd2[1], &g, sizeof(int));
  85.             } // end while
  86.         } // end if
  87.     } //end for
  88.  
  89.     // Trzeba zamknac ;/
  90.     close(pipefd2[1]);
  91.  
  92.     tmp = 0;
  93.  
  94.     // Czytam
  95.     suma = 0;
  96.     while(read(pipefd2[0], &tmp, sizeof(int)))
  97.         suma += tmp;
  98.  
  99.  
  100.     printf("Suma = %d\n", suma);
  101.     printf("koniec\n");
  102.  
  103.     return EXIT_SUCCESS;
  104.  
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement