Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.27 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. long factorial(int n)
  13. {
  14.     unsigned long fact = 1;
  15.     int i;
  16.  
  17.     for (i = 1; i <= n; i++)
  18.         fact = fact * i;
  19.  
  20.     return fact;
  21. }
  22.  
  23. int main() {
  24.     if(pipe(pipe1) == -1) {
  25.         perror("Nie udało się utworzyć pipe do komunikacji procesa macierzystego z potomkiem liczacym silnie");
  26.     }
  27.  
  28.     if(pipe(pipe2) == -1) {
  29.         perror("Nie udało się utworzyć pipe do komunikacji potomkow");
  30.     }
  31.  
  32.     int rc = fork();
  33.     if(rc == 0) {
  34.         proces2();
  35.         exit(0);
  36.     }
  37.  
  38.     rc = fork();
  39.     if(rc == 0) {
  40.         proces3();
  41.         exit(0);
  42.     }
  43.  
  44.     close(pipe1[0]);
  45.     int odczytanaWartosc = -1;
  46.     while(1) {
  47.         scanf("%d", &odczytanaWartosc);
  48.         fflush(stdout);
  49.         rc = write(pipe1[1], (char*)&odczytanaWartosc, sizeof(int));
  50.         if(rc < 0) {
  51.             perror("Nie moge zapisac do pipe");
  52.             exit(1);
  53.         }
  54.         if(odczytanaWartosc < 0)
  55.             break;
  56.     }
  57.     wait(0);
  58.     wait(0);
  59.     printf("Wszystkie procesy zakończyły pracę\n");
  60.     fflush(stdout);
  61. }
  62.  
  63. void proces2() {
  64.     close(pipe1[1]);
  65.     close(pipe2[0]);
  66.     int odebranaWartosc = -1;
  67.     long fact = 0;
  68.     while (1)
  69.     {
  70.         int rc = read(pipe1[0], (char *)&odebranaWartosc, sizeof(int));
  71.         if(rc < 0) {
  72.             perror("Nie moge odczytac z pipe");
  73.             exit(1);
  74.         }
  75.         fact = factorial(odebranaWartosc);
  76.         if(odebranaWartosc < 0) {
  77.             fact = -1;
  78.         }
  79.         rc = write(pipe2[1], (char*)&fact, sizeof(long));
  80.         if(rc < 0) {
  81.             perror("Nie moge zapisac do pipe");
  82.             exit(1);
  83.         }
  84.  
  85.         if(odebranaWartosc < 0)
  86.             break;
  87.     }
  88.     close(pipe1[1]);
  89.    
  90. }
  91. void proces3() {
  92.     close(pipe2[1]);
  93.     long odebranaWartosc = -1;
  94.     while( 1 )
  95.     {
  96.         int rc = read(pipe2[0], (char *)&odebranaWartosc, sizeof(long));
  97.         if(rc < 0) {
  98.             perror("Nie moge odczytac z pipe");
  99.             exit(1);
  100.         }
  101.         if(odebranaWartosc < 0)
  102.             break;
  103.         printf("%ld\n", odebranaWartosc);
  104.         fflush(stdout);
  105.     }
  106.     close(pipe2[0]);
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement