Manpages

名 前

pread, pwrite − 指 定 し た オ フ セ ッ ト で フ ァ イ ル デ ィ ス ク リ プ タ ー を 読 み 書 き す る

書 式

#include <unistd.h>

ssize_t pread(int fd, void *buf, size_t count, off_t offset);

ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

pread(), pwrite():

_XOPEN_SOURCE >= 500
|| /* glibc 2.12 以 降 : */ _POSIX_C_SOURCE >= 200809L

説 明

pread() は 、 フ ァ イ ル デ ィ ス ク リ プ タ ー fd の (フ ァ イ ル の 先 頭 か ら の ) オ フ セ ッ ト offset か ら 最 大 count バ イ ト を バ ッ フ ァ ー buf へ 読 み 込 む 。 フ ァ イ ル オ フ セ ッ ト は 変 化 し な い 。

pwrite() は 、 バ ッ フ ァ ー buf か ら 最 大 count バ イ ト を フ ァ イ ル デ ィ ス ク リ プ タ ー fd の オ フ セ ッ ト offset に 書 き 込 む 。 フ ァ イ ル オ フ セ ッ ト は 変 化 し な い 。

fd で 参 照 さ れ る フ ァ イ ル は シ ー ク (seek) 可 能 で な け れ ば な ら な い 。

返 り 値

成 功 し た 場 合 、 読 み 書 き を 行 っ た バ イ ト 数 が 返 さ れ る (ゼ ロ は 、 pwrite() の 場 合 に は 何 も 書 か れ な か っ た こ と を 意 味 し 、 pread() の 場 合 に は フ ァ イ ル の 末 尾 に 達 し た こ と を 意 味 す る )。 エ ラ ー の 場 合 は −1 が 返 さ れ 、 errno が そ の エ ラ ー を 示 す よ う に 設 定 さ れ る 。

エ ラ ー

pread() で は 、 read(2) お よ び lseek(2) で 規 定 さ れ た 全 て の エ ラ ー が 発 生 す る 可 能 性 が あ り 、 errno に は エ ラ ー を 示 す 値 が 設 定 さ れ る 。 pwrite() で は 、 write(2) お よ び lseek(2) で 規 定 さ れ た 全 て の エ ラ ー が 発 生 す る 可 能 性 が あ り 、 errno に は エ ラ ー を 示 す 値 が 設 定 さ れ る 。

バ ー ジ ョ ン

シ ス テ ム コ ー ル pread() と pwrite() は Linux に バ ー ジ ョ ン 2.1.60 で 追 加 さ れ た 。 i386 の シ ス テ ム コ ー ル の エ ン ト リ ー は 2.1.69 で 追 加 さ れ た 。 (シ ス テ ム コ ー ル を 持 た な い 古 い カ ー ネ ル で の lseek(2) を 使 っ た エ ミ ュ レ ー シ ョ ン を 含 め る と ) C ラ イ ブ ラ リ に お け る サ ポ ー ト は glibc 2.1 で 追 加 さ れ た 。

準 拠

POSIX.1−2001.

注 意

シ ス テ ム コ ー ル pread() と pwrite() は 、 特 に マ ル チ ス レ ッ ド ア プ リ ケ ー シ ョ ン で 役 に 立 つ 。 こ れ ら を 使 う と 、 他 の ス レ ッ ド に よ る フ ァ イ ル オ フ セ ッ ト の 変 更 の 影 響 を 受 け る こ と な く 、 複 数 の ス レ ッ ド が 同 じ フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て 入 出 力 を 行 う こ と が で き る 。

Linux で は 、 裏 で 呼 び 出 さ れ る シ ス テ ム コ ー ル の 名 前 が カ ー ネ ル 2.6 で 変 更 さ れ た 。 pread() は pread64() に な り 、 pwrite() は pwrite64() に な っ た 。 シ ス テ ム コ ー ル の 番 号 は 変 更 さ れ て い な い 。 glibc の pread() と pwrite() の ラ ッ パ ー 関 数 は こ れ ら の 変 更 を 吸 収 し て い る 。 い く つ か の 32 ビ ッ ト ア ー キ テ ク チ ャ ー で は 、 こ れ ら の シ ス テ ム コ ー ル の 呼 び 出 し 時 の シ グ ネ チ ャ ー が 違 っ て い ま す 。 理 由 は syscall(2) で 説 明 さ れ て い る 通 り で す 。

バ グ

POSIX で は 、 O_APPEND フ ラ グ を 指 定 し て フ ァ イ ル を オ ー プ ン し た 場 合 、 pwrite() が デ ー タ を 書 き 込 む 位 置 に 影 響 を 及 ぼ さ な い こ と が 求 め ら れ て い る 。 し か し 、 Linux で は 、 フ ァ イ ル を O_APPEND 付 き で オ ー プ ン し た 場 合 、 offset の 値 に 関 わ ら ず 、 pwrite() は フ ァ イ ル の 末 尾 に デ ー タ を 追 記 す る 。

関 連 項 目

lseek(2), read(2), readv(2), write(2)

こ の 文 書 に つ い て

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