Проверяет понимание жизненного цикла процессов в Unix-подобных системах и механизма обработки завершённых процессов.
Зомби-процесс (или процесс-зомби) — это процесс, который завершил своё выполнение, но его запись в таблице процессов ещё не удалена. Это происходит потому, что родительский процесс не вызвал системный вызов wait() или waitpid(), чтобы получить статус завершения дочернего процесса. В этот момент процесс находится в состоянии Z (zombie) и не использует процессорное время или память, но занимает место в таблице процессов.
Когда дочерний процесс завершается, ядро отправляет сигнал SIGCHLD родителю. Если родитель игнорирует этот сигнал или не вызывает wait(), запись о дочернем процессе остаётся. Это необходимо, чтобы родитель мог узнать код возврата. Если родитель сам завершается, зомби-процесс становится сиротой и его усыновляет процесс init (PID 1), который автоматически вызывает wait() и удаляет запись.
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// Дочерний процесс
printf("Child exiting\n");
return 0;
} else {
// Родитель не вызывает wait()
sleep(10); // Пока спит, дочерний процесс — зомби
printf("Parent done\n");
}
return 0;
}В этом примере дочерний процесс завершается, но родитель не вызывает wait(), поэтому дочерний процесс становится зомби на время сна родителя.
wait() или waitpid() в родительском процессе.SIGCHLD с waitpid() в цикле.Зомби-процессы — это нормальное явление в Unix-системах, но их накопление может привести к исчерпанию таблицы процессов. Правильная обработка завершения дочерних процессов через wait() или сигналы — обязательная практика для системных программистов и администраторов.