Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.25 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "unistd.h"
  3. #include "wait.h"
  4. #include "stdlib.h"
  5.  
  6. int pipe1[2];
  7. int pipe2[2];
  8.  
  9. void proces2();
  10. void proces3();
  11.  
  12. /* Funkcja liczy silnie*/
  13. long factorial(int n)
  14. {
  15.     unsigned long fact = 1;
  16.     int i;
  17.  
  18.     for (i = 1; i <= n; i++)
  19.         fact = fact * i;
  20.  
  21.     return fact;
  22. }
  23.  
  24. int main() {
  25.     /* Tworze pipe i sprawdzam czy się udało*/
  26.     if(pipe(pipe1) == -1) {
  27.         perror("Nie udało się utworzyć pipe do komunikacji procesa macierzystego z potomkiem liczacym silnie");
  28.     }
  29.     /* Tak samo dla pipe 2*/
  30.     if(pipe(pipe2) == -1) {
  31.         perror("Nie udało się utworzyć pipe do komunikacji potomkow");
  32.     }
  33.     /* Tworzę pierwszego konsumenta */
  34.     int rc = fork();
  35.     if(rc == 0) {
  36.         proces2();
  37.         exit(0);
  38.     }
  39.     /* Tworzę drugiego konsumenta */
  40.     rc = fork();
  41.     if(rc == 0) {
  42.         proces3();
  43.         exit(0);
  44.     }
  45.     /* Zamykam dekryptor do odczytu do pipe1[0] bo ten proces do niego zapisuje a nie odczytuje */
  46.     close(pipe1[0]);
  47.     int odczytanaWartosc = -1;
  48.     while(1) {
  49.         /* Czytam z klawiatury liczbę*/
  50.         scanf("%d", &odczytanaWartosc);
  51.         /* Przesywam tą liczbę przez pipe do konsumenta proces 2*/
  52.         rc = write(pipe1[1], (char*)&odczytanaWartosc, sizeof(int));
  53.         if(rc < 0) {
  54.             perror("Nie moge zapisac do pipe");
  55.             exit(1);
  56.         }
  57.         /* Jeśli liczba była ujemna kończę pracę */
  58.         if(odczytanaWartosc < 0)
  59.             break;
  60.     }
  61.     /* czekam aż procesy 2 i 3 zakończą pracę i informuję o tym użytkownika */
  62.     wait(0);
  63.     wait(0);
  64.     printf("Wszystkie procesy zakończyły pracę\n");
  65.     fflush(stdout);
  66. }
  67.  
  68. void proces2() {
  69.     /* Zamykam nieużywane deskryptory*/
  70.     close(pipe1[1]);
  71.     close(pipe2[0]);
  72.     int odebranaWartosc = -1;
  73.     long fact = 0;
  74.     while (1)
  75.     {
  76.         /* Odczytuje liczbe od producenta przez pipe*/
  77.         int rc = read(pipe1[0], (char *)&odebranaWartosc, sizeof(int));
  78.         if(rc < 0) {
  79.             perror("Nie moge odczytac z pipe");
  80.             exit(1);
  81.         }
  82.         /* Liczę silnię */
  83.         fact = factorial(odebranaWartosc);
  84.         if(odebranaWartosc < 0) {
  85.             fact = -1;
  86.         }
  87.         /* Wysyłam obliczoną liczbę przez pipe do procesu 3, jeśli liczba była ujemna przesyłam -1 co jest sygnałem do zakończenia pracy */
  88.         rc = write(pipe2[1], (char*)&fact, sizeof(long));
  89.         if(rc < 0) {
  90.             perror("Nie moge zapisac do pipe");
  91.             exit(1);
  92.         }
  93.         /* Kończzę pracę jeśli odbiorę liczbę <0 */
  94.         if(odebranaWartosc < 0)
  95.             break;
  96.     }
  97.     close(pipe1[1]);
  98.    
  99. }
  100. void proces3() {
  101.     close(pipe2[1]);
  102.     long odebranaWartosc = -1;
  103.     while( 1 )
  104.     {
  105.         /* Pobieram liczbę od procesu 2*/
  106.         int rc = read(pipe2[0], (char *)&odebranaWartosc, sizeof(long));
  107.         if(rc < 0) {
  108.             perror("Nie moge odczytac z pipe");
  109.             exit(1);
  110.         }
  111.         /* Jeśli jest mniejsza od 0 kończę pracę */
  112.         if(odebranaWartosc < 0)
  113.             break;
  114.         /* W przeciwnym wypadku wyświetlam przesłany wynik*/
  115.         printf("%ld\n", odebranaWartosc);
  116.         fflush(stdout);
  117.     }
  118.     close(pipe2[0]);
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement