如何判断Perl中输入文件句柄的缓冲区中是否有数据?

时间:2009-11-18 18:33:58

标签: perl sockets buffering

我正在开发一个使用基于epoll的事件循环来处理多个同时套接字连接的程序。当应用程序检测到有要读取的数据时,它会调用process_request()子进程,该子进程使用缓冲的IO。例如:

sub process_request {
    my ( $fh ) = @_;
    if ( my $line = <$fh> ) {
        # Do something interesting
    }
}

麻烦的是,通过在这里使用缓冲I / O,epoll不知道缓冲区中有未读数据,因此它不会再次调用process_request()。

所以问题是,我如何检测Perl中文件句柄中是否有未读数据,这样只要数据保留在缓冲区中,我就可以再次调用process_request()?

1 个答案:

答案 0 :(得分:1)

嗯,我知道你正在使用自己的事件循环,而不是POE,但你可能还是想借用POE的过滤器;它们可以在不使用其余POE的情况下加载。初始化每个套接字POE::Filter::Line,当套接字可读时,对其所有内容执行非阻塞read,并使用$filter->get将它们推送到过滤器中。返回将是(0或更多)行的arrayref,并且任何部分行将存储在过滤器中,等待该行的其余部分。

如果这不具吸引力,那么,您可以自己重新实现相同的想法。这不是一项大量的工作,主要是每个插槽的字符串缓冲区和正则表达式匹配。