IO::Select - OO 介面呼叫 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
的句柄即可
如果存在,則傳回真值(實際上是句柄本身)。否則傳回未定義。
傳回所有已註冊句柄的陣列。
傳回準備好可讀取的句柄陣列。TIMEOUT
是在傳回空清單($!
不變)之前的最大等待時間(秒),可能是小數。如果未指定TIMEOUT
且已註冊任何句柄,則呼叫會無限期封鎖。發生錯誤時,會傳回空清單,並設定$!
以指出錯誤。若要區分逾時和錯誤,請在呼叫此方法之前將$!
設定為零,並在傳回空清單後檢查它。
與can_read
相同,但檢查可寫入的句柄。
與can_read
相同,但檢查具有例外狀況的句柄,例如待處理的帶外資料。
傳回物件在呼叫其中一個can_
方法或將物件傳遞給select
靜態方法時將檢查的句柄數目。
傳回適合作為核心 select() 呼叫參數的位元字串。
select
是一個靜態方法,也就是說,您使用套件名稱呼叫它,就像new
一樣。READ
、WRITE
和EXCEPTION
為undef
或IO::Select
物件。TIMEOUT
是選用的,其效果與核心 select 呼叫相同。
如果至少有一個句柄準備好進行指定類型的操作,則結果將是一個包含 3 個元素的陣列,每個元素都是對陣列的參考,該陣列將包含準備好讀取、寫入和有例外狀況的句柄。逾時時,會傳回空清單,並保持$!
不變。發生錯誤時,會傳回空清單,並設定$!
以指出錯誤。若要區分逾時和錯誤,請在呼叫此方法之前將$!
設定為零,並在傳回空清單後檢查它。
以下是一個簡短範例,顯示如何使用 IO::Select
來撰寫一個伺服器,與多個 socket 通訊,同時也監聽 listen socket 上的更多連線
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 Porters 維護。請將所有錯誤報告至 https://github.com/Perl/perl5/issues。
版權所有 (c) 1997-8 Graham Barr <gbarr@pobox.com>。保留所有權利。此程式為自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。