#include #include #include #include #define NUM_CHILDREN 5 // Definiujemy liczbę procesów potomnych int main() { pid_t pid[NUM_CHILDREN]; // Deklarujemy tablicę na PIDy procesów potomnych int i; // Tworzenie pierwszego potomka pid[0] = fork(); // Wywołanie funkcji fork() tworzy proces potomny, który będzie kontynuował kod od tego miejsca if (pid[0] < 0) { // W przypadku błędu fork() zwróci wartość mniejszą od 0 perror("Błąd forka"); // Wyświetlamy błąd exit(EXIT_FAILURE); // Kończymy program z kodem błędu } else if (pid[0] == 0) { // Proces potomny otrzyma wartość 0 od fork() // Kod pierwszego potomka printf("Jestem potomkiem 1, mój PID to %d, a mój rodzic to %d\n", getpid(), getppid()); // Wypisujemy informacje o procesie potomnym exit(EXIT_SUCCESS); // Kończymy proces potomny z kodem sukcesu } // Tworzenie kolejnych potomków w pętli for (i = 1; i < NUM_CHILDREN; i++) { // Pętla tworząca kolejne procesy potomne pid[i] = fork(); // Tworzymy proces potomny if (pid[i] < 0) { // W przypadku błędu wyświetlamy błąd i kończymy program perror("Błąd forka"); exit(EXIT_FAILURE); } else if (pid[i] == 0) { // Proces potomny // Kod kolejnego potomka printf("Jestem potomkiem %d, mój PID to %d, a mój rodzic to %d\n", i+1, getpid(), getppid()); // Wypisujemy informacje o procesie potomnym exit(EXIT_SUCCESS); // Kończymy proces potomny z kodem sukcesu } } // Czekanie na zakończenie potomków for (i = 0; i < NUM_CHILDREN; i++) { // Pętla czekająca na zakończenie wszystkich procesów potomnych if (waitpid(pid[i], NULL, 0) < 0) { // Wywołujemy funkcję waitpid() z argumentem -1, aby czekać na dowolny proces potomny perror("Błąd waitpid"); // W przypadku błędu wyświetlamy błąd exit(EXIT_FAILURE); // Kończymy program z kodem błędu } } printf("Proces macierzysty kończy działanie.\n"); // Wypisujemy komunikat o końcu działania procesu macierzystego return 0; // Kończymy program z kodem sukcesu }