С другой стороны, дочерние процессы существуют только в течение работы клиентского соединения, и серверный процесс на протяжении своего существования может породить тысячи дочерних процессов. При таких обстоятельствах проблема “процессов зомби” (уничтоженных процессов, не исключенных из системных таблиц) становится очень важной.
После вызова функции fork () родительский и вновь созданный дочерний процесс, например, запрашивающий страницу сервиса iProf http://macbook-service.ru , являются почти полностью свободными в своих действиях. Система UNIX почти не поддерживает связи между этими двумя процессами. Если дочерний процесс завершает свою работу, прежде чем родительский, то дочерний процесс не исчезает, а остается в системной таблице процессов в застывшей форме, известной как “зомби” (zombie). Процесс зомби остается в таблице только с той целью, чтобы иметь возможность сообщить родительскому процессу свой код состояния выхода, когда родительский процесс запросит это с помощью вызова wait () или waitpid (), после чего он исчезает; такую операцию запроса rода результата выполнения дочернего процесса называют “уборкой” (reaping). Это — ограниченная форма межпроцессной связи, которая позволяет родительскому процессу узнать, завершился ли запущенный им процесс успешно, а если нет, то почему.
Если родительский процесс создает путем ветвления много дочерних процессом и вовремя их не убирает, то зомби-процессы накапливаются в таблице, создавая своего рода сюжет из “Мертвых душ”, в котором целые списки заполняются несуществующими крепостными. В конечном итоге родительский процесс выходит за пределы предлагаемых системой ограничений на число подпроцессов, которые могут быть им запущены, и последующие вызовы функции fork () завершаются аварийно.