Строки 15-20. Создание приемного сокета, инициализация сервера. Создается приемный сокет и вызывается процедура init_server () модуля Daemon для записи файла РID и перехода в фоновый режим. В этом режиме демон может выполнять ряд операций, например, получение информации с веб страниц, через безлимитный Интернет http://altel.kz/internet/ .
Строки 21-24. Главный цикл. Теперь программа входит в главный цикл, в котором запускается определенное число дочерних процессов, указанных константой prefork_children, а затем выполняется переход в режим ожидания до получения сигнала. Как будет показано ниже, каждый вызов подпрограммы make_new_child () приводит к увеличению значения глобальной переменной $child_count на единицу в результате создания в ней дочернего процесса, а каждый вызов процедуры обратного вызова chld уменьшает значение переменной $child_count, если он приводит к уничтожению дочернего процесса. Назначение этого цикла состоит в ожидании до тех пор, пока не будет получен chld или другой сигнал, а затем в вызове подпрограммы make_new_child () столько раз, сколько потребуется для доведения числа дочерних процессов до предела, установленного константой prefork_children.
Эти действия повторяются неопределенно долго до тех пор, пока родительский процесс не получит сигнал Int или term и не установит переменную $done равной истинному значению.
Строки 25-27. Уничтожение дочерних процессов и выход. После выхода из главного цикла все дочерние процессы уничтожаются путем вызова подпрограммы kill_children () модуля Daemon. Суть этой процедуры выражается следующей строкой кода:
kill TERM => keys %CHILDREN;
где %children — хеш, содержащий идентификаторы активных дочерних процессов, запущенных в подпрограмме launch_child (). Подпрограмма kill_children () переходит в состояние ожидания до тех пор, пока не будет уничтожен последний дочерний процесс.