読者です 読者をやめる 読者になる 読者になる

selectシステムコール

os linux perl

たまに聞くけどよくわからんので調べてみた。

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