#include #include #include #include #include #include "err.h" #define NR_PROC 5 // Wersja z rekurencją void solve(int n) { if (n == 1) { printf("current:%d parent:%d\n", getpid(), getppid()); return; } pid_t pid = fork(); if (pid == -1) { syserr("Error in fork\n"); } else if (pid == 0) { // jeśli jest potomkiem solve(n-1); } else { // jeśli jest rodzicem if (wait(0) == -1) { // Czeka az potomek skonczy. syserr("Error in wait\n"); } printf("current:%d parent:%d\n", getpid(), getppid()); } } int main () { // solve(NR_PROC); pid_t pid; int i; /* Wersja w pętli */ for (i = 1; i <= NR_PROC; i++) { if (i == NR_PROC) { printf("current:%d parent:%d\n", getpid(), getppid()); return 0; } switch (pid = fork()) { case -1: syserr("Error in fork\n"); case 0: /* proces potomny */ continue; default: /* proces macierzysty */ { if (wait(0) == -1) { // Czeka az potomek skonczy. syserr("Error in wait\n"); } printf("current:%d parent:%d\n", getpid(), getppid()); return 0; } } } return 0; }