#include #include #include #include #include #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; }