Строки 16-18. Инициализация сервера. Вызывается процедура init server () модуля Daemon для создания файла РID сервера, автоматического перевода в фоновый режим и инициализации ведения журнала.
Строки 19-30. Главный цикл приема. Программа входит в цикл, в котором вызывается функция accept (), производится ветвление с созданием дочернего процесса для обслуживания соединения, после чего выполнение цикла продолжается. Цикл закончится только после того, как обработчик прерывания int или term установит глобальную переменную $done равной истинному значению.
Такая конструкция программы имеет один недостаток — основную часть времени цикл проводит в состоянии, заблокированном в результате вызова функции accept (), поэтому, вероятно, сигнал к завершению работы будет получен во время этого системного вызова. Однако accept () представляет собой один из тех медленных вызовов системы ввода-вывода, в отличии от прикладных программ сопряжения, которые автоматически перезапускаются после прерывания по сигналу. Хотя переменная $DONE установлена равной истинному значению, сервер примет еще одно, последнее входящее соединение, прежде чем обнаружит, что настало время завершить работу. Однако желательно, чтобы сервер завершил работу немедленно.
В предыдущей версии сервера с ветвлением мы должны были выбрать один из двух вариантов: либо предусмотреть немедленное уничтожение серверного процесса обработчиком прерывания, либо использовать механизм тайм-аута модуля IO::Socktfl для обеспечения возможности прерывания работы функции accept ().