名 前
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_DATA と SEEK_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 |
whence が SEEK_DATA か SEEK_HOLE で 、 現 在 の フ ァ イ ル オ フ セ ッ ト が フ ァ イ ル の 末 尾 を 超 え た 位 置 で あ る 。 |
準 拠
SVr4, 4.3BSD, POSIX.1−2001.
SEEK_DATA と SEEK_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/ に 書 か れ て い る 。