Perl - Win32 - Как выполнить неблокирующее чтение дескриптора файла из другого процесса?
-
02-07-2019 - |
Вопрос
Я пишу некоторый серверный код, который взаимодействует с клиентским процессом через 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
.