内容

名称

IO::Select - select 系统调用的面向对象接口

概要

use IO::Select;

$s = IO::Select->new();

$s->add(\*STDIN);
$s->add($some_handle);

@ready = $s->can_read($timeout);

@ready = IO::Select->new(@handles)->can_read(0);

描述

IO::Select 包实现了对系统 select 函数调用的面向对象方法。它允许用户查看哪些 IO 处理程序(参见 IO::Handle)已准备好进行读取、写入或是否有异常待处理。

构造函数

new ( [ HANDLES ] )

构造函数创建一个新对象,并可以选择用一组处理程序初始化它。

方法

add ( HANDLES )

将处理程序列表添加到 IO::Select 对象中。当事件发生时,这些值将被返回。IO::Select 将这些值保存在一个缓存中,该缓存按处理程序的 fileno 进行索引,因此如果指定了多个具有相同 fileno 的处理程序,则只缓存最后一个处理程序。

每个处理程序可以是 IO::Handle 对象、整数或数组引用,其中第一个元素是 IO::Handle 或整数。

remove ( HANDLES )

从对象中移除所有给定的句柄。此方法也通过句柄的 fileno 工作。因此,不需要传递确切的句柄,只需要传递具有等效 fileno 的句柄。

exists ( HANDLE )

如果句柄存在,则返回一个真值(实际上是句柄本身)。否则返回 undef。

handles

返回所有已注册句柄的数组。

can_read ( [ TIMEOUT ] )

返回一个准备读取的句柄数组。TIMEOUT 是在返回空列表($! 不变)之前等待的最大时间(以秒为单位,可能是小数)。如果未给出 TIMEOUT 并且注册了任何句柄,则调用将无限期阻塞。发生错误时,将返回一个空列表,$! 设置为指示错误。为了区分超时和错误,在调用此方法之前将 $! 设置为零,并在返回空列表后检查它。

can_write ( [ TIMEOUT ] )

can_read 相同,只是检查可以写入的句柄。

has_exception ( [ TIMEOUT ] )

can_read 相同,只是检查具有异常条件的句柄,例如待处理的带外数据。

count ()

返回对象在调用其中一个 can_ 方法或将对象传递给 select 静态方法时将检查的句柄数量。

bits()

返回适合作为核心 select() 调用参数的位字符串。

select ( READ, WRITE, EXCEPTION [, TIMEOUT ] )

select 是一个静态方法,也就是说,你用包名调用它,就像 new 一样。READWRITEEXCEPTION 都是 undefIO::Select 对象。TIMEOUT 是可选的,它与核心 select 调用的效果相同。

如果至少有一个句柄已准备好进行指定的类型操作,则结果将是一个包含 3 个元素的数组,每个元素都是一个对数组的引用,该数组将保存已准备好进行读取、写入和具有异常的句柄。超时时,将返回一个空列表,$! 不变。发生错误时,将返回一个空列表,$! 设置为指示错误。为了区分超时和错误,在调用此方法之前将 $! 设置为零,并在返回空列表后检查它。

EXAMPLE

这是一个简短的示例,它展示了如何使用 IO::Select 来编写一个服务器,该服务器与多个套接字通信,同时还监听监听套接字上的更多连接。

use IO::Select;
use IO::Socket;

$lsn = IO::Socket::INET->new(Listen => 1, LocalPort => 8080);
$sel = IO::Select->new( $lsn );

while(@ready = $sel->can_read) {
    foreach $fh (@ready) {
        if($fh == $lsn) {
            # Create a new socket
            $new = $lsn->accept;
            $sel->add($new);
        }
        else {
            # Process socket

            # Maybe we have finished with the socket
            $sel->remove($fh);
            $fh->close;
        }
    }
}

作者

Graham Barr。目前由 Perl 维护者维护。请在 https://github.com/Perl/perl5/issues 报告所有错误。

版权

版权所有 (c) 1997-8 Graham Barr <[email protected]>。保留所有权利。本程序是自由软件;您可以在 Perl 本身相同的条款下重新发布和/或修改它。