IO::Select模块
IO::Select模块
[b]IO::Select[/b]
系统调用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);

[b]描述[/b]
IO::Select包实现了类似于系统函数select的调用,允许用户了解到有哪些句柄就绪可读或可写或未知的例外
[b]构造[/b]
new([HANDLE])
创建新的对象,并且可随意用一组句柄来初始化

[b]方法[/b]
add(HANDLES) 向对象中增加一个句柄的列表,它是一个事务发生时将要返回的值,IO::Select将这些值保存在高速缓冲区内,并以句柄的fileno建立索引,因此如果多于一个的句柄被指定相同的fileno,那么只将最后一个存入缓冲区。
每一个句柄能够成为一个IO::Select对象,一个整数或第一元素为IO::Handle或整数的数组的指针。

remove(HANDLES) 从对象中移除所给的句柄,同样针对句柄的fileno工作,所增加的具有相同fileno的句柄将不被通过。
exits(HANDLES) 如果句柄现在是存在的,返回一个真值(实际上是句柄本身),其他情况返回未定义。
handles 返回一个数组,元素包括所有已注册的数组。
can_read([TIMEOUT]) 返回一个数组,元素包括已就绪的可读的句柄。TIMEOUT是在返回一个空数组前的等待的最大时间数,若未指定TIMEOUT并且所有句柄已注册,则调用将阻塞。
can_write([TIMEOUT]) 除了是返回可写的句柄外其它与can_read相同。
has_exception([TIMEOUT]) 检测句柄的异常状态。
count() 返回句柄的数目,当调用一个can_方法或对象通过select静态方法时被检测的句柄的数目。
bit() [color=#FF6600]Return the bit string suitable as argument to the core select() call [/color]
select(READ,WRITE,EXCEPTION[,TIMEOUT]) select是一个静态方法,调用它要像调用new()那样带上包名。READ, WRITE 和EXCEPTION 可以是undef或IO::Select对象。TIMEOUT是可选的,具有与核心selcet调用相同的作用。
返回的结果是一个三元素的数组,每个元素是分别指向存储着已就绪可读,可写和未知状态的句柄所组成的数组的指针。如果遇到错误返回一个空列表。

[b]例[/b]
短例展示了如何用IO::Select来写一个与一些套接字通信兵在一个套接字监听更多通信的服务器程序。

[color=#008000] use IO::Select;
use IO::Socket;

$lsn = new IO::Socket::INET(Listen => 1, LocalPort => 8080);
$sel = new IO::Select( $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;
}
}
}[/color]