sysseek FILEHANDLE



sysseekは、seekの変種で、引数FILEHANDLEのファイルシステムのread/wirte位置をlseek(2)システムコールを使って設定・取得します。FILEHANDLEは式でも構いません。その場合はその値がファイルハンドルの名前となります。WHENCEの値が、0ならば、新しい位置をPOSITIONの位置へ、1 ならば、現在位置からPOSITION加えた位置へ、2 ならば、EOFからPOSITIONだけ加えた位置へ、新しい位置を設定します。この値には、Fcntlモジュールで使われているSEEK_SET、SEEK_CUR、SEEK_END(0=ファイルの先頭、1=現在位置、2=ファイルの最後)という定数を使うこともできます。

sysseekはstdioをバイパスしますので、 (sysread以外の)読み込み、 print、write、seek、tell、eofと混ぜて使うと混乱を引き起こします。

sysseekの返却値は、成功時に新しい位置を返します。失敗したときは未定義値を返します。位置がゼロの場合は、0 but trueの文字列として返されます。

sysseekの使い方

use Fcntl qw(:DEFAULT :flock);
use IO::Seekable;
・・・
sysopen(FH, $file, O_WRONLY|O_APPEND|O_CREAT);
flock(FH, LOCK_EX);

# ファイルの末尾に位置を設定
sysseek(FH, 0, SEEK_END)
or die "sysseek error: $!";