Perl - Win32 - Как выполнить неблокирующее чтение дескриптора файла из другого процесса?

StackOverflow https://stackoverflow.com/questions/141332

Вопрос

Я пишу некоторый серверный код, который взаимодействует с клиентским процессом через STDIN.Я пытаюсь написать фрагмент кода perl, который асинхронно получает ответы от стандартного вывода клиента.Блокирующая версия кода может выглядеть следующим образом:

sub _read_from_client
{
   my ($file_handle) = @_;
   while (my $line = <$file_handle>) {
      print STDOUT $line;
   }
   return;
}

Важно отметить, что фрагмент должен работать на платформе Win32.Есть много решений для платформ * nix, которые меня не интересуют.Я использую ActivePerl 5.10.

Это было полезно?

Решение

Этот поток вкл . Перлмонки предполагает, что вы можете сделать сокет неблокирующим в Windows на Perl таким образом:

ioctl($socket, 0x8004667e, 1);

Более подробная информация и ресурсы в этой теме

Другие советы

Если вы не хотите идти по низкоуровневому пути, вам придется обратиться к другим, более рамочным решениям.

Вы можете использовать Нитки для чтения из входных данных и того, чтобы он запихивал все данные, которые он считывает, в Поток::Очередь который вы затем обрабатываете в своем основном потоке.

Вы можете посмотреть на ПО который реализует фреймворк, основанный на событиях, особенно POE::Колесо::Запустить::Win32.Потенциально вы также можете украсть из него код, чтобы самостоятельно реализовать неблокирующее чтение.

Вы можете посмотреть на [Coro], который реализует совместную систему многозадачности с использованием сопрограмм.Это в основном похоже на потоки, за исключением того, что вы получаете потоки пользовательского пространства, а не системные потоки.

Вы не указали, как далеко вы хотите продвинуться, но ваш выбор - между sysread и фреймворк, или напишите упомянутый фреймворк самостоятельно.Самый простой путь - это просто использовать потоки или пройти через код Poe::Wheel::Run::Win32.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top