lseek - システムコールの説明 - Linux コマンド集 一覧表
名前
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 ()関数は、オフセットをファイルの末尾を越えた位置に設定できる (但し、これによりファイルのサイズが変わらない)。 もしデータがこのオフセット位置以降に書き込まれた場合、 間の空隙の部分 ("穴 (hole)") の読み出しがあると、 実際にそこにデータを書き込まれるまでは NULL バイト ('\0') の列が返される。
返り値
成功した場合、 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.
制限
いくつかのデバイスでは seek ができない。
POSIX はどのデバイスが
lseek
()に対応すべきかは規定していない。
Linux 特有の制限として: tty デバイスに lseek
() を使用すると
ESPIPE
を返す。
注意
この文章で使用した
whence
は英語として正しくないが、
歴史的理由によりそのまま使われている。
古いコードを変換する時は whence
の値を以下のマクロに置き換えること:
.TS c c l l. 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)