Manpages

名 前

read − フ ァ イ ル デ ィ ス ク リ プ タ ー か ら 読 み 込 む

書 式

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

説 明

read() は フ ァ イ ル デ ィ ス ク リ プ タ ー (file descriptor) fd か ら 最 大 count バ イ ト を buf で 始 ま る バ ッ フ ァ ー へ 読 み 込 も う と す る 。

seek に 対 応 し て い る フ ァ イ ル で は 、 read は 現 在 の フ ァ イ ル オ フ セ ッ ト か ら 行 わ れ 、 フ ァ イ ル オ フ セ ッ ト は 読 み 込 ん だ バ イ ト 数 分 だ け 進 め ら れ る 。 現 在 の フ ァ イ ル オ フ セ ッ ト が フ ァ イ ル 末 尾 か そ れ よ り 先 の 場 合 は 、 読 み 出 し は 行 わ れ ず 、 read() は 0 を 返 す 。

count が 0 の 場 合 、 read() は 以 下 で 説 明 す る エ ラ ー を 検 出 す る 場 合 が あ る 。 ど の エ ラ ー も な か っ た 場 合 、 も し く は read() が エ ラ ー の チ ェ ッ ク を 行 わ な い 場 合 、 count が 0 で 呼 び 出 さ れ た read() は 0 を 返 し 、 何 も 行 わ な い 。

countSSIZE_MAX よ り 大 き け れ ば 、 結 果 は 規 定 で き な い 。

返 り 値

成 功 し た 場 合 、 読 み 込 ん だ バ イ ト 数 を 返 す (0 は フ ァ イ ル の 終 り を 意 味 す る )。 フ ァ イ ル 位 置 は こ の 数 だ け 進 め ら れ る 。 こ の 数 が 要 求 し た 数 よ り 小 さ か っ た と し て も エ ラ ー で は な い ; 例 え ば 今 す ぐ に は 実 際 に そ れ だ け の 数 し か な い 場 合 (フ ァ イ ル の 最 後 に 近 い の か も し れ な い し 、 パ イ プ (pipe) や 端 末 (terminal) か ら 読 み 込 ん で い る か も し れ な い ) や read() が シ グ ナ ル (signal) に よ っ て 割 り 込 ま れ た 場 合 に こ れ は 起 こ り え る 。 エ ラ ー の 場 合 は 、 −1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。 こ の 場 合 は フ ァ イ ル 位 置 が 変 更 さ れ る か ど う か は 不 定 で あ る 。

エ ラ ー

EAGAIN フ ァ イ ル デ ィ ス ク リ プ タ ー

fd が ソ ケ ッ ト 以 外 の フ ァ イ ル を 参 照 し て い

て 、 非 停 止 (nonblocking) モ ー ド (O_NONBLOCK) に 設 定 さ れ て お り 、 読 み 込 み を 行 う と 停 止 す る 状 況 に あ る 。

EAGAIN ま た は EWOULDBLOCK フ ァ イ ル デ ィ ス ク リ プ タ ー fd が ソ ケ ッ ト を 参 照 し て い て 、 非 停 止 (nonblocking) モ ー ド (O_NONBLOCK) に 設 定 さ れ て お り 、 読 み 込 み を 行 う と 停 止 す る 状 況 に あ る 。 POSIX.1−2001 は 、 こ の 場 合 に ど ち ら の エ ラ ー を 返 す こ と も 認 め て お り 、 こ れ ら 2 つ の 定 数 が 同 じ 値 を 持 つ こ と も 求 め て い な い 。 し た が っ て 、 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は 、 両 方 の 可 能 性 を 確 認 す べ き で あ る 。

EBADF

fd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い か 、 読 み 込 み の た め に オ ー プ ン (open) さ れ て い な い 。

EFAULT

buf が ア ク セ ス 可 能 な ア ド レ ス 空 間 の 外 に あ る 。

EINTR

何 の デ ー タ も 読 み 込 ま な い う ち に シ グ ナ ル に 割 り 込 ま れ た 。 signal(7) 参 照 。
EINVAL

fd は 読 み 込 み に 適 し て い な い オ ブ ジ ェ ク ト を 参 照 し て い る 。 も し く は 、 フ ァ イ ル が O_DIRECT フ ラ グ を 指 定 し て オ ー プ ン さ れ て い る が 、 buf に 指 定 さ れ た ア ド レ ス 、 count に 指 定 さ れ た 値 、 現 在 の フ ァ イ ル オ フ セ ッ ト の い ず れ か の ア ラ イ ン メ ン ト が 不 適 切 で あ る 。

EINVAL

fdtimerfd_create(2) の 呼 び 出 し で 作 成 さ れ た が 、 read() に 間 違 っ た サ イ ズ の バ ッ フ ァ ー が 渡 さ れ た 。 さ ら な る 情 報 は timerfd_create(2) を 参 照 の こ と 。

EIO

I/O エ ラ ー 。 こ れ は 例 え ば プ ロ セ ス が バ ッ ク グ ラ ン ド プ ロ セ ス グ ル ー プ で 、 そ れ を 制 御 し て い る 端 末 か ら 読 み 込 も う と し 、 SIGTTIN が 無 視 (ignore) ま た は 禁 止 (blocking) さ れ て い る 場 合 や 、 そ の プ ロ セ ス グ ル ー プ が 孤 立 (orphan) し て い る 場 合 に 起 こ る 。 ま た デ ィ ス ク や テ ー プ を 読 ん で い る 時 に 低 レ ベ ル I/O エ ラ ー が 発 生 し た 場 合 に も 起 こ る 。

EISDIR

fd が デ ィ レ ク ト リ を 参 照 し て い る 。

fd が 接 続 し て い る オ ブ ジ ェ ク ト に よ っ て は 他 の エ ラ ー も 起 こ り え る 。 POSIX で は 、 い く ら か の デ ー タ を 読 ん だ 後 に 割 り 込 み が 起 こ っ た 場 合 、 read() は (errnoEINTR を 設 定 し て ) −1 を 返 し て も よ い し 、 既 に 読 み 込 ん だ バ イ ト 数 を 返 し て も よ い 。

準 拠

SVr4, 4.3BSD, POSIX.1−2001.

注 意

NFS に お い て 。 少 量 の デ ー タ を 読 み 込 む 場 合 、 最 初 の 時 の み に タ イ ム ス タ ン プ が 更 新 さ れ 、 続 く コ ー ル で は 更 新 さ れ な い だ ろ う 。 こ れ は ク ラ イ ア ン ト 側 で 属 性 の キ ャ ッ シ ン グ を 行 な う た め で あ る 。 な ぜ な ら ば 、 も し 全 て の NFS ク ラ イ ア ン ト が st_atime (最 終 フ ァ イ ル ア ク セ ス 時 刻 ) の 更 新 を サ ー バ ー に 送 ら ず 、 ク ラ イ ア ン ト 側 で キ ャ ッ シ ュ を 読 む こ と に 満 足 し て い れ ば 、 サ ー バ ー 側 で の read は 発 生 し な い の で st_atime の 更 新 は 行 な わ れ か ら だ 。 UNIX の 方 式 で は 、 ク ラ イ ア ン ト 側 の 属 性 の キ ャ ッ シ ン グ を 無 効 に す る こ と で 、 こ れ を 得 る こ と が で き る 。 し か し ほ と ん ど の 状 況 で は こ れ は 続 く サ ー バ ー の 負 荷 を 増 加 さ せ 、 パ フ ォ ー マ ン ス の 低 下 を も た ら す 。

バ グ

POSIX.1−2008/SUSv4 セ ク シ ョ ン XSI 2.9.7 ("Thread Interactions with Regular File Operations") に よ る と 、 以 下 の す べ て の 関 数 で は 、 通 常 フ ァ イ ル も し く は シ ン ボ リ ッ ク リ ン ク に 対 す る 操 作 で は POSIX.1−2008 で 規 定 さ れ た 効 果 が 互 い に ア ト ミ ッ ク に 行 わ れ な け れ ば な ら な い : ... こ の 後 に 書 か れ て い る API の 中 に read() と readv(2) で あ る 。 ス レ ッ ド ( や プ ロ セ ス ) 間 で ア ト ミ ッ ク に 適 用 す る こ と が 求 め ら れ る 効 果 の 一 つ と し て 、 フ ァ イ ル オ フ セ ッ ト の 更 新 が あ る 。 し か し な が ら 、 バ ー ジ ョ ン 3.14 よ り 前 の Linux で は 、 こ の 限 り で は な い 。 オ ー プ ン フ ァ イ ル 記 述 (open file description) を 共 有 す る 2 つ の プ ロ セ ス が 同 時 に read() (や readv(2)) を 実 行 し た 場 合 、 こ の I/O 操 作 で は フ ァ イ ル オ フ セ ッ ト の 更 新 に 関 し て は ア ト ミ ッ ク で は な く 、 2 つ の プ ロ セ ス の read で 取 得 さ れ る デ ー タ ブ ロ ッ ク が (間 違 っ て ) 重 な る 可 能 性 が あ る 。 こ の 問 題 は Linux 3.14 で 修 正 さ れ た 。

関 連 項 目

close(2), fcntl(2), ioctl(2), lseek(2), open(2), pread(2), readdir(2), readlink(2), readv(2), select(2), write(2), fread(3)

こ の 文 書 に つ い て

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