selectシステムコール
たまに聞くけどよくわからんので調べてみた。
perldoc
select RBITS,WBITS,EBITS,TIMEOUT
This calls the select(2) syscall with the bit masks specified,
which can be constructed using "fileno" and "vec", along these
lines:
select(2)
select() や pselect() を使うと、プログラムで複数のファイルディスクリプタを監視し、 一つ以上のファイルディスクリプタがある種の I/O 操作の 「ready (準備ができた)」状態 (例えば、読み込み可能になった状態) になるまで待つことができる。 ファイルディスクリプタが ready (準備ができた) とは、 対応する I/O 操作 (例えば read(2) など) が停止 (block) なしに実行可能な状態にあることを意味する。
ふむー。とりあえず見よう見まねでサンプルを書いてみた。
open my $fh, '<', './input.txt' or die $!; my $read_bits = fhbits($fh); my ($nfound,$timeleft) = select($read_bits, undef, undef, 1); warn "nfound: $nfound"; close $fh; sub fhbits { my @fhlist = @_; my $bits = ""; for my $fh (@fhlist) { vec($bits, fileno($fh), 1) = 1; } return $bits; }
このケースでは当然$nfoundは1にしかならないけど。
1つ以上のファイルディスクリプタがreadyになるか、timeoutするまでブロックするシステムコール、ということですね。なんとなくわかった気になった。ちなみにlow-levelで扱うのは厳しそうなので、perlならIO::Selectを使うのがよさげ。