Рассмотрим код адаптивного сервера с предварительным ветвлением, в котором для межпроцессной связи применяется канал.
Строки 1-8. Загрузка модулей. Загружаются стандартные модули IO::*, Fcntl, а также собственные модули Daemon и Web.
Строки 9-14. Определение констант. Определено несколько новых констант. Константы hi_water_mark и lo_water_mark, соответственно, устанавливают максимальное и минимальное число простаивающих серверных процессов. В данном примере для них специально выбраны небольшие значения, чтобы было проще следить за работой программы. Константа debug указывает, нужно ли выводить отладочную информацию.
Строки 15, 16. Объявление глобальных переменных. Установка флажка $done равным истинному значению вызывает завершение работы сервера. Хеш % status содержит информацию о состоянии дочерних процессов. Как и в предыдущем примере, ключами этого хеша являются идентификаторы дочерних процессов, а значениями — информация состояния.
Строка 17. Обработчики прерываний. Устанавливается обработчик сигналов int и term, который присваивает флажку $done истинное значение, что приводит к завершению работы сервера. Напомним также, что модуль Daemon автоматически обрабатывает сигнал chld, удаляя информацию о завершившихся дочерних процессах из системных таблиц и сопровождая список идентификаторов дочерних процессов в глобальной переменной %children.
Строки 18-21. Создание сокета. Как и прежде, создается приемный сокет.
Строки 22-24. Создание канала. Создается однонаправленный канал с помощью функции pipe (), и дескриптор чтения сигнала read канала добавляется к набору IO::Select для использования в главном цикле. (Более подробно применение модуля IO:: Select будет описано ниже.)