LSEEK(2)

名前
lseek - ファイルの読み書きオフッセトの位置を変える

書式
#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fildes, off_t offset, int whence);

説明
lseek 関数はファイル・ディスクリター(descriptor) fildes のオフセットを whence に従って offset 引き数の位置へ以下のように変更する:

SEEK_SET
    オフセットは offset バイトに設定される。

SEEK_CUR
    オフセットは現在位置に offset バイトを足した値になる。

SEEK_END
    オフセットはファイルのサイズに offset バイトを足した値になる。

lseek 関数はオフセットを存在するファイルのファイルの最後(end-of-file)を 超えた場所に設定することができる。もしデータがこの時点より後に書き込まれた ならば、間の空隙の部分を読み込んだ場合は(実際にそこにデータを書き込むまでは )ゼロのバイト列が返される。

返り値
成功した場合は lseek は結果のファイル位置をファイルの先頭からのバイト数で返す。そうでなれば 値として (off_t)-1 を返し、 errno にエラーが指示される。

エラー

EBADF
    fildes がオープンされたファイル・ディスクリプターでない。

ESPIPE
    fildes がパイプ(pipe), ソケット(socket), FIFO を参照している。

EINVAL
    whence が正しい値でない。

準拠
SVr4, POSIX, BSD 4.3

制限
いくつかのデバイスでは seek ができない。POSIX ではそのような デバイスのサポートを要求していない。 Linux 特有の制限として: tty デバイスに lseek を使用すると、 ESPIPE を返す。他のシステムでは書き込まれた文字の数を返し、 SEEK_SET でそのカウンターを設定できる。いくつかのデバイス、例えば /dev/null は ESPIPE エラーを起こさないが、返される ポインターは未定義である。

注意
この文章で使用した whence は英語として正しくないが、 歴史的理由により維持されている。 古いコードを変換する時は whence の値を以下のマクロに置き換えること:

old | new
0 | SEEK_SET
1 | SEEK_CUR
2 | SEEK_END
L_SET | SEEK_SET
L_INCR | SEEK_CUR
L_XTND | SEEK_END

SVR1-3 では off_t の代りに long を返し、 BSD では int を返す。

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