Facebook
From 9qoq, 1 Month ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 159
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <math.h>
  5. #include <sys/wait.h>
  6.  
  7. #define READ_END 0
  8. #define WRITE_END 1
  9.  
  10. // Funkcja do obliczania silni
  11. double factorial(int n) {
  12.     double result = 1.0;
  13.     for (int i = 2; i <= n; ++i) {
  14.         result *= i;
  15.     }
  16.     return result;
  17. }
  18.  
  19. int main() {
  20.     int pipe1[2], pipe2[2]; // Deklaracja dwóch łącz nienazwanych
  21.     pipe(pipe1);
  22.     pipe(pipe2);
  23.  
  24.     pid_t pid1, pid2, pid3; // PID procesów potomnych
  25.  
  26.     // Tworzenie procesu potomnego 1
  27.     pid1 = fork();
  28.     if (pid1 == 0) {
  29.         close(pipe1[READ_END]); // Zamykanie nieużywanego końca łącza
  30.  
  31.         double x, eps;
  32.         printf("Proces 1: Podaj X i Eps > 0: ");
  33.         scanf("%lf %lf", &x, &eps;);
  34.  
  35.         // Wysyłanie danych do procesu potomnego 2 przez łącze
  36.         write(pipe1[WRITE_END], &x, sizeof(double));
  37.         write(pipe1[WRITE_END], &eps;, sizeof(double));
  38.  
  39.         close(pipe1[WRITE_END]); // Zamknięcie końca zapisu łącza
  40.         exit(0);
  41.     }
  42.  
  43.     // Tworzenie procesu potomnego 2
  44.     pid2 = fork();
  45.     if (pid2 == 0) {
  46.         close(pipe1[WRITE_END]); // Zamykanie nieużywanego końca łącza
  47.         close(pipe2[READ_END]); // Zamykanie nieużywanego końca łącza
  48.  
  49.         double x, eps, sum = 0.0, term;
  50.         read(pipe1[READ_END], &x, sizeof(double)); // Odczytanie danych od procesu 1
  51.         read(pipe1[READ_END], &eps;, sizeof(double));
  52.  
  53.         // Obliczanie sumy szeregu
  54.         int i = 0;
  55.         do {
  56.             term = pow(x, i) / factorial(i);
  57.             printf("Proces 2: Term %d: %lf\n", i, term); // Dodatkowe wypisanie wartości kolejnych wyrazów szeregu
  58.             sum += term;
  59.             ++i;
  60.         } while (fabs(term) >= eps); // Używamy fabs, aby sprawdzić wartość bezwzględną
  61.  
  62.         // Wysyłanie sumy do procesu potomnego 3 przez łącze
  63.         write(pipe2[WRITE_END], &sum;, sizeof(double));
  64.  
  65.         close(pipe1[READ_END]); // Zamknięcie końca odczytu łącza
  66.         close(pipe2[WRITE_END]); // Zamknięcie końca zapisu łącza
  67.         exit(0);
  68.     }
  69.  
  70.     // Tworzenie procesu potomnego 3
  71.     pid3 = fork();
  72.     if (pid3 == 0) {
  73.         close(pipe2[WRITE_END]); // Zamykanie nieużywanego końca łącza
  74.  
  75.         double sum;
  76.         read(pipe2[READ_END], &sum;, sizeof(double)); // Odczytanie sumy od procesu 2
  77.  
  78.         printf("Proces 3: Suma wyrazów szeregu: %lf\n", sum);
  79.  
  80.         close(pipe2[READ_END]); // Zamknięcie końca odczytu łącza
  81.         exit(0);
  82.     }
  83.  
  84.     close(pipe1[READ_END]); // Zamknięcie nieużywanego końca łącza w procesie rodzicielskim
  85.     close(pipe1[WRITE_END]);
  86.     close(pipe2[READ_END]);
  87.     close(pipe2[WRITE_END]);
  88.  
  89.     // Oczekiwanie na zakończenie procesów potomnych
  90.     wait(NULL);
  91.     wait(NULL);
  92.     wait(NULL);
  93.  
  94.     return 0;
  95. }