內容

名稱

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,已準備好讀取、寫入或有例外狀況待處理。

建構函式

new ( [ HANDLES ] )

建構函式建立一個新物件,並選擇性地使用一組句柄初始化它。

方法

add ( HANDLES )

將句柄清單新增到 IO::Select 物件。當事件發生時,將傳回這些值。IO::Select 將這些值保存在快取中,並由句柄的 fileno 編製索引,因此如果指定多個具有相同 fileno 的句柄,則只會快取最後一個。

每個句柄可以是 IO::Handle 物件、整數或陣列參考,其中第一個元素是 IO::Handle 或整數。

remove ( HANDLES )

從物件中移除所有指定的句柄。此方法也適用於句柄的fileno。因此,不需要傳遞已新增的確切句柄,只需要具有等效fileno的句柄即可

exists ( HANDLE )

如果存在,則傳回真值(實際上是句柄本身)。否則傳回未定義。

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一樣。READWRITEEXCEPTIONundefIO::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 相同的條款下重新散布或修改它。