5部 関数リファレンス

select

select RBITS, WBITS, EBITS, TIMEOUT



指定したファイル記述子のうち、どれが入出力操作が可能になっているのか、またはどれが例外状態にあるかを調べるものです。selectシステムコールを実行します。

ファイル記述子については用語集「ファイル記述子」を参照してください。

ビットマスクは、filenovecを使って、次のようにして作成することができます。

$rin = $win = $ein = '';
vec($rin,fileno(STDIN),1) = 1;
vec($win,fileno(STDOUT),1) = 1;
$ein = $rin | $win; 

複数のファイルハンドルにselectを行ないたいのであれば、次のようなサブルーチンを書くとよいでしょう。

sub fhbits {
	local(@fhlist) = split(' ',$_[0]);
	local($bits);
	for (@fhlist) {
		vec($bits,fileno($_),1) = 1;
	}
	$bits;
}
$rin = &fhbits('STDIN TTY SOCK'); 

通常は、次のように使います。

($nfound,$timeleft) = select($rout=$rin, $wout=$win, $eout=$ein, $timeout);

いずれかの準備が整うまでブロックするには、次のようにします。

$nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef);

どのビットマスクにもundefを設定することができます。TIMEOUTを指定するときは、秒数で指定し、少数でかまいません。

250 ミリ秒のsleepと同じ効果が、次のようにして得られます。

select(undef, undef, undef, 0.25);

関連記事