Строки 48-55. Подпрограмма change_privileges (). Она идентична предыдущим версиям.
Строки 56-70. Подпрограмма launch_child(). Теперь различные операции ветвления и инициализации дочерних серверных процессов сосредоточены в подпрограмме launch_child(). Эта подпрограмма принимает один параметр, путь к каталогу. Если этот параметр задан, он передается подпрограмме prepare_child () для вызова функции chroot ().
Выполнение подпрограммы начинается с создания нового набора сигналов POSIX::SigSet, содержащего такие сигналы, как int, chld, term и hup. После этого предпринимается попытка ветвления. Если при ветвлении возникает ошибка, в журнале регистрируется сообщение. Если возвращенный PID больше 0, управление находится в родительском процессе, поэтому PID дочернего процесса добавляется к хешу %children. В дочернем процессе переустанавливаются четыре обработчика сигналов для выполнения ими действий, предусмотренных по умолчанию, и вызывается подпрограмма prepare_child () для установки привилегий пользователя и смены корневого каталога.
Перед выходом из подпрограммы разблокируются все сигналы, которые были получены в течение этого периода, и идентификатор дочернего процесса, если он есть, возвращается вызывающей процедуре. Эти действия выполняются и в родительском, и в дочернем процессах.
Строки 71-79. Подпрограмма prepare_child(). Эта подпрограмма идентична предыдущим версиям, за исключением того, что выполнение функции chroot () зависит от того, был ли передан этой функции путь к каталогу. В любом случае эта подпрограмма перекрывает реальный идентификатор пользователя действующим, в результате чего дочерний процесс лишается всех привилегий, унаследованных от родительского процесса.