ファイル制御のシステムコールを行う
fcntl
はファイル操作に関するシステムコールを行いますが、
Linux などの OS のシステムコール fcntl(2)
に対応しています。
FILEHANDLE には操作対象のファイルハンドルを指定します。 FUNCTION には対象のファイルハンドルへの操作を意味する数値を指定します。 SCALAR には FUNCTION に応じたパラメーターを指定します。
FUNCTION には数値を直接指定するのではなく、通常は、
Fcntl モジュールの定数を使います。
そのため、fcntl
を使う場合は、Fcntl モジュールをロードするのが一般的です。
use Fcntl;
my $flags = fcntl($filehandle, F_GETFL, 0)
or die "Can't fcntl F_GETFL: $!";
fcntl
の戻り値を defined
でチェックする必要はありません。
ioctl
と同様に、
システムコールから 0
が返ってきた場合、Perl では
"0 but true"
に置き換えられます。
この文字列は数値コンテキストでは 0
として扱われますが、
真偽値コンテキストでは真として扱われます。
さらに、不適切な数値変換における通常の Argument "..." isn't numeric
警告は出ません。
fcntl
は Windows のような fcntl(2)
を実装していないシステムで使うと例外を投げますので注意してください。
次のサンプルコードは、$REMOTE
のファイルハンドルをシステムレベルで非ブロッキングモードにセットします。
use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
my $flags = fcntl($REMOTE, F_GETFL, 0)
or die "Can't get flags for the socket: $!\n";
fcntl($REMOTE, F_SETFL, $flags | O_NONBLOCK)
or die "Can't set flags for the socket: $!\n";