Zad6
🧩 Syntax:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#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
}