А что если изменить строку, в которой выполняется чтение с сервера, примерно так:
while ($from_server = <$socket>) {
chomp $from_server; .
print $from_server,"n";
}
К сожалению, после этого дела обстоят еще хуже. Теперь сценарий зависает после получения им первой строки с сервера. FTP-сервер ожидает от пользователя команды, а сценарий ожидает поступления еще одной строки от сервера и даже еще не запросив ввод от пользователя; налицо тупиковая ситуация.
В действительности, никакая примитивная перестановка операторов ввода и вывода не позволяет устранить эту проблему. Сценарии либо выходит из синхронизации, либо попадает в безнадежную тупиковую ситуацию.
Клиент gab, вторая попытка. В действительности, задача состоит в том, чтобы отделить процесс чтения с удаленного хоста от процесса чтения из сокета. Для этого необходимо выделить эти задачи в два одновременных, но независимых процесса, которые не будут блокировать друг друга так, как в первой, примитивной реализации клиента gab.
В системах UNIX и Windows эту задачу проще всего решить с использованием команды fork() для создания двух копий сценария. Родительский процесс будет отвечать за копирование данных со стандартного устройства ввода на удаленный хост, а дочерний процесс — за обработку потока данных в другом направлении. К сожалению пользователи Macintosh не имеют доступа к этому системному вызову. Качественное, но немного более сложное решение, которое позволяет обойтись без вызова fork (), будет описываться далее в разделе “Мультиплексные приложения”.