Manpages

名 前

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)") の 読 み 出 し が あ る と 、 実 際 に そ こ に デ ー タ を 書 き 込 ま れ る ま で は ヌ ル バ イ ト ('\0') の 列 が 返 さ れ る 。 フ ァ イ ル の デ ー タ と ホ ー ル の 探 索
Linux バ ー ジ ョ ン 3.1 以 降 で は 、 whence に 以 下 の 値 も 指 定 す る こ と が で き る 。
SEEK_DATA
フ ァ イ ル オ フ セ ッ ト を offset 以 上 で 次 に デ ー タ が あ る 位 置 に 設 定 す る 。 offset が デ ー タ を 指 し て い る 場 合 に は 、 フ ァ イ ル オ フ セ ッ ト は offset に 設 定 さ れ る 。
SEEK_HOLE
フ ァ イ ル オ フ セ ッ ト を 、 位 置 が offset 以 上 の 次 の ホ ー ル (hole) に 設 定 す る 。 offset が ホ ー ル の 内 部 に あ る 場 合 は 、 フ ァ イ ル シ ス テ ム は offset に 設 定 さ れ る 。 offset 以 降 に ホ ー ル が な い 場 合 は 、 フ ァ イ ル オ フ セ ッ ト は フ ァ イ ル 末 尾 に 設 定 さ れ る (つ ま り 、 ど の フ ァ イ ル の 末 尾 に も 暗 黙 の ホ ー ル が 存 在 す る と い う こ と だ )。 上 記 の ど ち ら の 場 合 も 、 offset が フ ァ イ ル 末 尾 よ り も 先 を 指 し て い る 場 合 に は lseek() は 失 敗 す る 。 こ れ ら の 操 作 を 使 う こ と で 、 ア プ リ ケ ー シ ョ ン が 、 ま ば ら (sparse ) に ペ ー ジ が 割 り 当 て ら れ た フ ァ イ ル で ホ ー ル を マ ッ プ す る こ と が で き る 。 こ の 機 能 は フ ァ イ ル バ ッ ク ア ッ プ ツ ー ル な ど の ア プ リ ケ ー シ ョ ン で 有 用 で あ る 。 ホ ー ル を 見 つ け る 仕 組 み が あ れ ば 、 フ ァ イ ル バ ッ ク ア ッ プ ツ ー ル で 、 バ ッ ク ア ッ プ を 作 成 す る 際 に 保 存 領 域 を 節 約 し 、 ホ ー ル を 保 持 す る こ と が で き る 。 こ れ ら の 操 作 の 目 的 と し て は 、 ホ ー ル は (通 常 は ) バ ッ ク エ ン ド の フ ァ イ ル ス ト レ ー ジ に は 割 り 当 て ら れ て い な い 連 続 す る 0 の 列 で あ る 。 し か し 、 フ ァ イ ル シ ス テ ム に は ホ ー ル を 報 告 す る 義 務 は な く 、 そ の た め 、 こ れ ら の 操 作 は 、 フ ァ イ ル に 実 際 に 割 り 当 て ら れ た ス ト レ ー ジ 領 域 を マ ッ ピ ン グ す る 方 法 と し て は 確 実 性 の あ る 仕 組 み で は な い 。 (ま た 、 バ ッ ク エ ン ド の ス ト レ ー ジ に 実 際 に 書 き 込 ま れ た 連 続 す る 0 の 列 は ホ ー ル と し て 報 告 さ れ な い こ と も あ る 。 ) 最 も 単 純 な 実 装 と し て は 、 SEEK_HOLE は 常 に フ ァ イ ル 末 尾 の オ フ セ ッ ト を 返 す よ う に し 、 SEEK_DATA は 常 に offset を 返 す よ う に す る こ と で 、 フ ァ イ ル シ ス テ ム は こ れ ら の 操 作 を サ ポ ー ト す る こ と が で き る (SEEK_DATA は 常 に offset を 返 す と い う の は 、 offset が 参 照 す る 場 所 が ホ ー ル で あ っ た と し て も 、 連 続 す る 0 の 列 の デ ー タ で 構 成 さ れ て い る と み な す と い う こ と で あ る )。

<unistd.h> か ら SEEK_DATASEEK_HOLE の 定 義 を 得 る に は 、 機 能 検 査 マ ク ロ _GNU_SOURCE を 定 義 し な け れ ば な ら な い 。

SEEK_HOLE, SEEK_DATA 操 作 に 対 応 し て い る の は 以 下 の フ ァ イ ル シ ス テ ム で あ る 。

*

Btrfs (Linux 3.1 以 降 )

*

OCFS (Linux 3.2 以 降 )

*

XFS (Linux 3.5 以 降 )

*

ext4 (Linux 3.8 以 降 )

*

tmpfs (Linux 3.8 以 降 )

返 り 値

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

エ ラ ー

EBADF

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

EINVAL

whence が 有 効 な 値 で は な い 。 ま た は 、 seek の 結 果 、 フ ァ イ ル オ フ セ ッ ト が 負 に な っ て し ま う か 、 seek 可 能 な デ バ イ ス の 末 尾 を 越 え て し ま う 。

EOVERFLOW 結 果 の フ ァ イ ル オ フ セ ッ ト を off_t 型 で 表 現 す る こ と が で き な い 。

ESPIPE

fd が パ イ プ 、 ソ ケ ッ ト 、 FIFO を 参 照 し て い る 。

ENXIO

whenceSEEK_DATASEEK_HOLE で 、 現 在 の フ ァ イ ル オ フ セ ッ ト が フ ァ イ ル の 末 尾 を 超 え た 位 置 で あ る 。

準 拠

SVr4, 4.3BSD, POSIX.1−2001.

SEEK_DATASEEK_HOLE は 非 標 準 の 拡 張 で 、 Solaris, FreeBSD, DragonFly BSD に も 存 在 す る 。 こ れ ら は POSIX の 次 の 版 (Issue 8) に 入 れ る よ う 提 案 さ れ て い る 。

注 意

フ ァ イ ル デ ィ ス ク リ プ タ ー 、 オ ー プ ン フ ァ イ ル 記 述 、 フ ァ イ ル の 関 係 の 説 明 に つ い て は open(2) を 参 照 。 い く つ か の デ バ イ ス で は seek が で き な い 。 POSIX は ど の デ バ イ ス が lseek() に 対 応 す べ き か は 規 定 し て い な い 。

Linux で は 、 端 末 (terminal) デ バ イ ス に lseek() を 使 用 す る と ESPIPE が 返 る 。 古 い コ ー ド を 変 換 す る 時 は whence の 値 を 以 下 の マ ク ロ に 置 き 換 え る こ と :

dup(2)fork(2) で 作 成 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー は 、 現 在 の フ ァ イ ル 位 置 ポ イ ン タ ー (current file position pointer) を 共 有 し て い る の で 、 こ の よ う な フ ァ イ ル で 移 動 を 行 う と 競 合 状 態 を 引 き 起 こ す 可 能 性 が あ る 。

関 連 項 目

dup(2), fork(2), open(2), fseek(3), lseek64(3), posix_fallocate(3)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。