Строки 80-85. Подпрограмма reap_child(). Эта подпрограмма представляет собой обработчик chld. Вызывается функция waitpid () в непрерываемом цикле, что влечет за собой выборку идентификаторов дочерних процессов, прекративших свою работу. Каждый процесс, который удален таким образом из системной таблицы процессов, устраняется из глобального хеша %children для обеспечения точного учета активных соединений.
Строки 86-90. Подпрограмма kill_children(). Отправляется сигнал term с указанием идентификатора каждого активного дочернего процесса. Затем подпрограмма входит в цикл, в котором она приостанавливается с помощью функции sleep ( ) до тех пор, пока хеш %children не будет пуст. Вызов sleep () может быть прерван только при получении сигнала, но, как правило, это происходит после получения входящего сигнала chld. Это — эффективный способ ожидания завершения всех дочерних соединений в родительском процессе.
Строки 91-99. Подпрограмма do_relaunch(). Назначение подпрограммы do_relaunch () состоит в восстановлении среды, по возможности, в такое состояние, в каком сервер находился при первом запуске, и в вызове функции ехес () для замены текущего процесса новым экземпляром сервера.
Выполнение подпрограммы начинается с восстановления привилегий суперпользователя путем установки значения действующего UID, равного реальному UID. Теперь необходимо восстановить первоначальный рабочий каталог. Однако сервер работает в режиме проверки потенциально опасных данных, а вызов функции chdir () чувствителен к потенциально опасным данным. Поэтому выполняется сопоставление с образцом имени рабочего каталога, хранящегося в переменной $cwd, и осуществляется вызов функции chdir () для перехода в каталог указанный полученным значением пути к каталогу.