LSEEK(2) | Linux Programmer's Manual | LSEEK(2) |
名前¶
lseek - ファイルの読み書きオフセットの位置を変える
書式¶
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
説明¶
lseek() 関数は、ファイルディスクリプタ (descriptor) fd に対応するオープンされたファイルのオフセットを、 whence に基づき offset 引き数の位置へ以下のように変更する:
- SEEK_SET
- オフセットは offset バイトに設定される。
- SEEK_CUR
- オフセットは現在位置に offset バイトを足した位置になる。
- SEEK_END
- オフセットはファイルのサイズに offset バイトを足した位置になる。
lseek() 関数は、オフセットをファイルの末尾を越えた位置に設定できる (但し、これによりファイルのサイズが変わらない)。 もしデータがこのオフセット位置以降に書き込まれた場合、 間の空隙の部分 ("穴 (hole)") の読み出しがあると、 実際にそこにデータを書き込まれるまでは NULL バイト ('\0') の列が返される。
返り値¶
成功した場合、 lseek() は結果のファイル位置をファイルの先頭からのバイト数で返す。 エラーの場合、値として (off_t) -1 を返し、 errno にエラーが指示される。
エラー¶
準拠¶
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)
2001-09-24 | Linux |