Ответ
Если родительский процесс завершается (нормально или принудительно), его дочерние процессы становятся "сиротами" (orphaned). В Linux/Unix системах такие процессы автоматически усыновляются процессом с PID 1 — это init или, в современных дистрибутивах, systemd. Этот процесс-приемник периодически вызывает wait() для сбора статуса завершения сирот.
Ключевые моменты:
- Если дочерний процесс уже завершился и находится в состоянии зомби (zombie),
init/systemdвызоветwait()и освободит его запись в таблице процессов. - Если дочерний процесс продолжает выполняться, он будет работать дальше под управлением PID 1.
- Это стандартное поведение ядра, предотвращающее накопление зомби-процессов.
Пример на Bash, демонстрирующий усыновление:
# Запускаем процесс, который создаст дочерний и завершится
sleep 60 &
CHILD_PID=$!
echo "Дочерний PID: $CHILD_PID, его родитель: $(ps -o ppid= -p $CHILD_PID)"
# Убиваем родительский процесс (текущую оболочку) - НЕ ВЫПОЛНЯЙТЕ В ПРОДУКТИВНОЙ СРЕДЕ
# kill -9 $$
# После этого, в другой сессии, можно проверить:
# ps -o ppid= -p $CHILD_PID
# Результат будет 1
На практике с этим сталкиваются при некорректном завершении демонов или контейнеров.