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