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

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

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

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

Ответы [ 2 ]

5 голосов
/ 27 сентября 2008

Этот поток в Perlmonks предлагает вам сделать неблокирование сокета в Windows в Perl следующим образом:

ioctl($socket, 0x8004667e, 1);

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

3 голосов
/ 27 сентября 2008

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

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

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

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

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

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...