kazmax - Linux で自宅サーバー

lseek - システムコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. エラー
  6. 準拠
  7. 制限
  8. 注意
  9. 関連項目

名前

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)