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


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

// Функция для "долгого" вычисления
void do_work() {
    long long sum = 0;
    for (int i = 0; i < 1000000000; i++) {
        sum += i;
    }
    printf("Дочерний процесс (вычисление) завершил работу. PID: %d\n", getpid());
}

int main() {
    pid_t pid1, pid2;

    // Создаём первый дочерний процесс (вычисление)
    pid1 = fork();
    if (pid1 == 0) {
        // Первый дочерний процесс
        do_work();
        exit(0);
    }

    // Создаём второй дочерний процесс (зомби)
    pid2 = fork();
    if (pid2 == 0) {
        // Второй дочерний процесс — сразу завершается
        printf("Дочерний процесс (зомби) создан и завершается. PID: %d\n", getpid());
        exit(0);
    }

    // Родительский процесс
    printf("Родительский процесс. PID: %d\n", getpid());

    // Демонстрация состояния зомби
    printf("\nДемонстрация состояния 'зомби' (процесс %d):\n", pid2);
    for (int i = 0; i < 5; i++) {
        printf("Итерация %d:\n", i + 1);
        system("ps -l"); // Выводим список процессов
        sleep(1);        // Пауза 1 секунда
    }

    // Очищаем зомби
    int status;
    waitpid(pid2, &status, 0); // Ожидаем завершения второго процесса
    printf("\nПроцесс-зомби (%d) очищен. Родитель вызвал wait().\n", pid2);

    // Ожидаем завершения первого процесса (вычисление)
    waitpid(pid1, &status, 0);
    printf("Все дочерние процессы завершены. Родитель завершает работу.\n");

    return 0;
}