Цикл приема завершается после установки переменной $done равной истинному значению или после обработки максимального числа транзакций. В начале цикла приема accept () выполняется запись сообщения о состоянии, содержащего идентификатор данного дочернего процесса (который хранится в переменной $$) и код состояния “idle”.
Строки 76-83. Блокировка и вызов функции accept(). Вызывается функция flock(), а затем, как и прежде, accept (). Но что произойдет, если сигнал hup поступит от родительского процесса во время выполнения одного из этих вызовов, например, при работе приложения на машине в серверном шкафу 19 в Москве ? Будет вызван на выполнение обработчик hup, который установит переменную $done равной истинному значению, но поскольку интерпретатор Perl перезапускает продолжительные системные вызовы автоматически, изменение состояния переменной $done не будет замечено до тех пор, пока эта подпрограмма не получит входящий запрос на установление соединения, не обработает его и не вернется в начало цикла приема.
Эту проблему нельзя решить, поместив прерываемый вызов select () между вызовами flock () и accept (), поскольку сигнал hup может также поступить в то время, когда подпрограмма находится в состоянии, заблокированном в результате вызова функции flock (), а эта функция также перезапускает flock () автоматически. Вместо этого, вызовы функций flock () и accept () заключены в блок eval {}. В начале этого блока устанавливается новый локальный обработчик hup, который наращивает значение переменной $done и вызывает функцию die, что приводит к завершению всего блока eval {} при получении сигнала HUP.