- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <math.h>
- #include <sys/wait.h>
- #define READ_END 0
- #define WRITE_END 1
- // Funkcja do obliczania silni
- double factorial(int n) {
- double result = 1.0;
- for (int i = 2; i <= n; ++i) {
- result *= i;
- }
- return result;
- }
- int main() {
- int pipe1[2], pipe2[2]; // Deklaracja dwóch łącz nienazwanych
- pipe(pipe1);
- pipe(pipe2);
- pid_t pid1, pid2, pid3; // PID procesów potomnych
- // Tworzenie procesu potomnego 1
- pid1 = fork();
- if (pid1 == 0) {
- close(pipe1[READ_END]); // Zamykanie nieużywanego końca łącza
- double x, eps;
- printf("Proces 1: Podaj X i Eps > 0: ");
- scanf("%lf %lf", &x, &eps;);
- // Wysyłanie danych do procesu potomnego 2 przez łącze
- write(pipe1[WRITE_END], &x, sizeof(double));
- write(pipe1[WRITE_END], &eps;, sizeof(double));
- close(pipe1[WRITE_END]); // Zamknięcie końca zapisu łącza
- exit(0);
- }
- // Tworzenie procesu potomnego 2
- pid2 = fork();
- if (pid2 == 0) {
- close(pipe1[WRITE_END]); // Zamykanie nieużywanego końca łącza
- close(pipe2[READ_END]); // Zamykanie nieużywanego końca łącza
- double x, eps, sum = 0.0, term;
- read(pipe1[READ_END], &x, sizeof(double)); // Odczytanie danych od procesu 1
- read(pipe1[READ_END], &eps;, sizeof(double));
- // Obliczanie sumy szeregu
- int i = 0;
- do {
- term = pow(x, i) / factorial(i);
- printf("Proces 2: Term %d: %lf\n", i, term); // Dodatkowe wypisanie wartości kolejnych wyrazów szeregu
- sum += term;
- ++i;
- } while (fabs(term) >= eps); // Używamy fabs, aby sprawdzić wartość bezwzględną
- // Wysyłanie sumy do procesu potomnego 3 przez łącze
- write(pipe2[WRITE_END], ∑, sizeof(double));
- close(pipe1[READ_END]); // Zamknięcie końca odczytu łącza
- close(pipe2[WRITE_END]); // Zamknięcie końca zapisu łącza
- exit(0);
- }
- // Tworzenie procesu potomnego 3
- pid3 = fork();
- if (pid3 == 0) {
- close(pipe2[WRITE_END]); // Zamykanie nieużywanego końca łącza
- double sum;
- read(pipe2[READ_END], ∑, sizeof(double)); // Odczytanie sumy od procesu 2
- printf("Proces 3: Suma wyrazów szeregu: %lf\n", sum);
- close(pipe2[READ_END]); // Zamknięcie końca odczytu łącza
- exit(0);
- }
- close(pipe1[READ_END]); // Zamknięcie nieużywanego końca łącza w procesie rodzicielskim
- close(pipe1[WRITE_END]);
- close(pipe2[READ_END]);
- close(pipe2[WRITE_END]);
- // Oczekiwanie na zakończenie procesów potomnych
- wait(NULL);
- wait(NULL);
- wait(NULL);
- return 0;
- }