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)已准备好进行读取、写入或是否有异常待处理。
构造函数创建一个新对象,并可以选择用一组处理程序初始化它。
将处理程序列表添加到 IO::Select
对象中。当事件发生时,这些值将被返回。IO::Select
将这些值保存在一个缓存中,该缓存按处理程序的 fileno
进行索引,因此如果指定了多个具有相同 fileno
的处理程序,则只缓存最后一个处理程序。
每个处理程序可以是 IO::Handle
对象、整数或数组引用,其中第一个元素是 IO::Handle
或整数。
从对象中移除所有给定的句柄。此方法也通过句柄的 fileno
工作。因此,不需要传递确切的句柄,只需要传递具有等效 fileno
的句柄。
如果句柄存在,则返回一个真值(实际上是句柄本身)。否则返回 undef。
返回所有已注册句柄的数组。
返回一个准备读取的句柄数组。TIMEOUT
是在返回空列表($!
不变)之前等待的最大时间(以秒为单位,可能是小数)。如果未给出 TIMEOUT
并且注册了任何句柄,则调用将无限期阻塞。发生错误时,将返回一个空列表,$!
设置为指示错误。为了区分超时和错误,在调用此方法之前将 $!
设置为零,并在返回空列表后检查它。
与 can_read
相同,只是检查可以写入的句柄。
与 can_read
相同,只是检查具有异常条件的句柄,例如待处理的带外数据。
返回对象在调用其中一个 can_
方法或将对象传递给 select
静态方法时将检查的句柄数量。
返回适合作为核心 select() 调用参数的位字符串。
select
是一个静态方法,也就是说,你用包名调用它,就像 new
一样。READ
、WRITE
和 EXCEPTION
都是 undef
或 IO::Select
对象。TIMEOUT
是可选的,它与核心 select 调用的效果相同。
如果至少有一个句柄已准备好进行指定的类型操作,则结果将是一个包含 3 个元素的数组,每个元素都是一个对数组的引用,该数组将保存已准备好进行读取、写入和具有异常的句柄。超时时,将返回一个空列表,$!
不变。发生错误时,将返回一个空列表,$!
设置为指示错误。为了区分超时和错误,在调用此方法之前将 $!
设置为零,并在返回空列表后检查它。
这是一个简短的示例,它展示了如何使用 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 本身相同的条款下重新发布和/或修改它。