В этой версии сервера применяется другая методика (для разнообразия). Вместо блокировки после вызова функции accept (), используется блокировка после вызова метода IO::Select->can_read (). В отличие от вызовов системы ввода-вывода, функций select () не перезапускается автоматически. При получении сигнала INT или ТERM выполнение метода can_read () прерывается, и он возвращает значение undef. Это обнаруживается и выполняется возврат в начало цикла, где распознается изменения значения переменной $DONE. Если вместо этого метод can_read () возвращает истинное значение, это значит, что имеется входящее соединение, например, инициализирующее контент интернет-магазина . Теперь можно перейти к вызову метода accept () объекта сокета. В случае его успешного выполнения вызывается подпрограмм launch_child (), экспортируемая модулем Daemon.
Напомним, что подпрограмма launch_child () представляет собой оболочку функции fork (), которая обеспечивает запуск дочерних процессов в условиях блокировки сигналов и обновляет глобальную переменную пакета, содержащую идентификаторы всех активных дочерних процессов. Подпрограмма launch_child () умеет принимать ряд параметров, в том числе указатель на процедуру обратного вызова, которая должна быть вызвана во время “уборки” дочернего процесса. В этом случае нет необходимости обрабатывать данное событие, поэтому параметры udfl программе не передаются.
Если подпрограмма launch_child () возвращает PID дочернего процесса, равный 0, это значит, что управление находится в дочернем процессе.