名前
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() は結果のファイル位置をファイルの先頭からのバイト数で返す。 エラーの場合、値として (off_t)-1 を返し、 errno にエラーが指示される。
エラー
EBADF | fildes がオープンされたファイルディスクリプタでない。 |
EINVAL | whence が SEEK_SET, SEEK_CUR, SEEK_END のどれでもない。 または、seek の結果、ファイル・オフセットが負になってしまうか、 seek 可能なデバイスの末尾を越えてしまう。 EOVERFLOW 結果のファイル・オフセットを off_t 型で表現することができない。 |
ESPIPE | fildes がパイプ、ソケット、FIFO を参照している。 |
準拠
SVr4, 4.3BSD, POSIX.1-2001.
注意
この文章で使用した whence は英語として正しくないが、 歴史的理由によりそのまま使われている。
いくつかのデバイスでは seek ができない。 POSIX はどのデバイスが lseek() に対応すべきかは規定していない。
Linux では、 tty デバイスに lseek() を使用すると ESPIPE を返す。
古いコードを変換する時は 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) や fork(2) で作成されたファイルディスクリプタは、現在のファイル位置ポインタ (current file position pointer) を共有しているので、 このようなファイルで移動を行うと競合状態を引き起こす可能性がある。
関連項目
dup(2), fork(2), open(2), fseek(3), lseek64(3), posix_fallocate(3)