3) Вызов функции accept () с указанием тайм-аута. Теперь программа входит в стандартный цикл accept (), который отличается лишь тем, что вызов функции accept () заключен в блок eval {}. В блоке eval создается локальный обработчик сигнала alrm, который вызывает функцию die (), и используется функция alarm() для установки таймера, который сработает по истечении числа минут, указанных параметром $timeout. Затем вызывается метод accept () приемного сокета. Если входящее соединение будет получено до истечения тайм-аута, то в результате выполнения блока eval {} будет создан подключенный сокет. В ином случае будет вызван обработчик сигнала alrm и выполнение блока eval {} закончится аварийно, с возвратом неопределенного значения. В последнем случае вызывается функция exit () и работа всего сервера прекращается. В ином случае вызывается функция alarm(0) для отмены тайм-аута.
4) Остальная часть сценария, устанавливаемая на выделенный сервер , остается неизменной. Включена также доработанная подпрограмма Chatbot::Eliza::_testquit (), которая позволяет избежать проблем, возникающих при неожиданном закрытии соединения пользователем.
Впервые разрабатывая эту программу, предполагалось, что можно просто использовать встроенный механизм тайм-аута модуля IO::Socket, а не разрабатывать собственную процедуру выхода по тайм-ауту на основе сигнала ALRM. Однако при этом возникла следующая проблема. При активизации встроенного механизма тайм-аута функция accept () возвращает значение undef и при возникновении законного тайм-аута, и при ее прерывании сигналом CHLD, которым сопровождает завершение каждого дочернего процесса. После некоторых проб и ошибок было решено, что нет простого способа различить эти два события, и применен специфический метод.