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を使うのがよさげ。