LSEEK(2)

名称
lseek - 読取り / 書込みファイルオフセット位置を変更する

ライブラリ
libc

書式
<unistd.h> off_t lseek(int fildes, off_t offset, int whence)

解説
lseek() システムコールは、ディレクティブ whence に従ってファイル記述子 fildes のオフセットを引数 offset に移動します。 引数 fildes はオープンファイル記述子でなければなりません。 lseek() システムコールは、次のようにファイル記述子 fildes に対応するファイル位置ポインタを移動します:

whence が SEEK_SET の場合、オフセットは offset バイトに設定されます。

whence が SEEK_CUR の場合、オフセットは現在の位置に offset バイトを加算したものに設定されます。

whence が SEEK_END の場合、オフセットはファイルのサイズに offset バイトを加算したものになります。

lseek() システムコールによって、ファイルオフセットをファイルの既存のファイルの 終り (EOF) を越えるところに設定できます。 後にデータがこの点に書き込まれると、 それ以後のギャップ内のデータに対する読取りは (データが実際にギャップ内に書き込まれるまで) データとして 0 を返します。

シークできないデバイスもあります。 そのようなデバイスに対応するポインタの値は未定義になります。

戻り値
処理が正常に完了すると lseek() は、ファイルの先頭から測定した結果のオフセット位置をバイト単位で返します。 そうでない場合は -1 が返され、エラーを示すために errno が設定されます。

エラー
lseek() システムコールは次の場合に処理を失敗し、ファイル位置ポインタは変更されません:

[EBADF]
    fildes 引数がオープンファイル記述子ではありません。

[EINVAL]
    whence 引数が正しい値ではないか、計算結果のファイルオフセットが キャラクタ型ではない特殊ファイルに使う負の値となりました。

[EOVERFLOW]
    計算結果のファイルオフセットが、 off_t 型のオブジェクトでは正しく表現できない値となりました。

[ESPIPE]
    fildes 引数はパイプ、ソケット、または FIFO と対応づけられています。

関連項目
dup(2), open(2)

バグ
このドキュメントの whence の使用法は正しくない英語ですが、歴史的な理由で維持されています。

規格
lseek() システムコールは p1003.1-90 に適合しています。

歴史
lseek() 関数は AT&T UNIX で登場しました。