在Windows的STDIN上使用IO :: Select

时间:2018-09-05 11:00:20

标签: windows perl select

当我在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。在Windows系统上的STDIN上如何使用IO::Select

1 个答案:

答案 0 :(得分:2)

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等效项为I/O Completion Ports。但是您必须找到一种在Perl中使用它们的方法。

如果您真的只关心STDIN,则可以使用Term::ReadKeyReadMode为-1(无阻塞)循环轮询。就像该模块的名称所暗示的那样,这可能仅适用于tty。