#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define N 7
#define EXEC_PROC 2
static const int parent_of[N + 1] = { -1, 0, 1, 1, 2, 2, 5, 6 };
static int delay = 0;
static void run_process(int num);
static void spawn_children(int num)
{
for (int j = 1; j <= N; j++) {
if (parent_of[j] != num)
continue;
pid_t pid = fork();
if (pid < 0) {
printf("[P%d] ID=%d: ошибка fork() для процесса P%d\n",
num, (int)getpid(), j);
exit(1);
} else if (pid == 0) {
run_process(j);
exit(0);
} else {
printf("[P%d] Процесс с ID %d (родитель %d) породил процесс P%d с ID %d\n",
num, (int)getpid(), (int)getppid(), j, (int)pid);
}
}
}
static void run_process(int num)
{
printf("[P%d] Запущен: мой ID = %d, ID родителя = %d\n",
num, (int)getpid(), (int)getppid());
spawn_children(num);
if (delay > 0)
sleep(delay);
while (wait(NULL) > 0)
;
if (num == EXEC_PROC) {
printf("[P%d] Процесс с ID %d и ID родителя %d заменяет себя программой whoami --version\n",
num, (int)getpid(), (int)getppid());
execlp("whoami", "whoami", "--version", (char *)NULL);
perror("execlp");
exit(1);
}
printf("[P%d] Процесс с ID %d и ID родителя %d завершает работу\n",
num, (int)getpid(), (int)getppid());
}
int main(int argc, char *argv[])
{
setvbuf(stdout, NULL, _IONBF, 0);
if (argc > 1)
delay = atoi(argv[1]);
run_process(1);
return 0;
}