Использование IO :: Select на STDIN в Windows - PullRequest
0 голосов
/ 05 сентября 2018

Когда я запускаю приведенный ниже код в системе Linux, как и ожидалось, он выводит Nothing is ready примерно каждые две секунды, а также выводит все, что вводится на консоль.

Но в Windows can_read мгновенно возвращается с нулевыми элементами.

use IO::Select;

my $sel = IO::Select->new();
$sel->add(\*STDIN);

while ( 1 ) {

    my @ready = $sel->can_read(2);

    if ( scalar @ready == 0 ) {
        print "Nothing is ready\n";
    }

    foreach my $fh ( @ready ) {

        if ( $fh eq \*STDIN ) {
            my $in = <STDIN>;
            print "got $in from stdin\n";
        }
    }
}

Кажется, что select работает только на Windows-сокетах, а не на STDIN. Как я могу использовать IO::Select на STDIN в системе Windows?

1 Ответ

0 голосов
/ 05 сентября 2018

Вы не можете, perldoc perlport заявляет:

select  Only implemented on sockets. (Win32, VMS)

Это вызвано тем, что сама Windows реализует select() только для сокетов, см. https://docs.microsoft.com/de-de/windows/desktop/api/winsock2/nf-winsock2-select.

Эквивалентом Windows является Порты завершения ввода / вывода . Но вы должны найти способ использовать их из Perl.

Если вы действительно заботитесь о STDIN, вы можете опрашивать в цикле с Term::ReadKey с ReadMode из -1 (неблокирующим). Как следует из названия модуля, это может работать только на tty.

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