Загрузка данных


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