Строки 28, 29. Завершение работы родительского процесса. Если значение переменной $child отлично от нуля, то управление находится в родительском процессе. В этом случае достаточно просто закрыть принадлежащую ему копию подключенного сокета и вернуться в начало цикла для приема с помощью функции accept () еще одного соединения. Пока родительский процесс ожидает нового соединения, дочерний процесс обрабатывает старое.
Строки 30-38. Подпрограмма interact(). Эта подпрограмма вызывается дочерним процессом для выполнения всех операций взаимодействия между клиентом и сервером.
Метод command_interfасе ( ) модуля Chatbot::Eliza жестко запрограммирован на чтение из устройства stdin и запись в устройство stdout. Однако нам необходимо вместо этого выполнять чтение и запись в сокете.
Фактически эту проблему решить несложно. При загрузке модуль io::Socket вызывает также методы родительского класса IO:: Handle. В число этих методов входит fdopen (), который рассматривался ранее (модули IO::Handle и IO::File). Метод fdopen() закрывает существующий дескриптор файла, а затем вновь открывает его с использованием информации из другого переданного ему дескриптора файла. Он работает с любым дескриптором файла, в том числе с тремя стандартными. В этой программе метод fdopen () вызывается три раза, для stdin, stdout и stderr. При каждом вызове методу fdopen () передается объект сокета и символьное обозначение режима доступа. Устройство stdin переоткрывается для чтения в режиме <, а устройства stdout и stderr — для записи в режиме >. А теперь, почти как в сказочном кино по мановению волшебной палочки, при выводе в устройства stdout и stderr данные будут записываться в подключенный сокет, а при вводе из устройства stdin будут считываться из сокета.
Остальная часть этой подпрограммы идентична психотерапевтической программе с интерфейсом командной строки, приведенной в листинге ранее. Включен режим автоматического сброса, чтобы данные, выводимые из устройства stdout объектом chatbot::Eliza, немедленно поступали на удаленный конец соединения, создается новый объект chatbot::Eliza и вызывается его метод command_interface ().