Man page - read(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru ro zh_TW zh_CN de

Manual

READ

名 前
書 式
説 明
返 り 値
エ ラ ー
準 拠
注 意
バ グ
関 連 項 目
こ の 文 書 に つ い て

名 前

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 を 返 し 、 何 も 行 わ な い 。

According to POSIX.1, if count is greater than SSIZE_MAX , the result is implementation-defined; see NOTES for the upper limit on Linux.

返 り 値

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

エ ラ ー の 場 合 は 、 -1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。 こ の 場 合 は フ ァ イ ル 位 置 が 変 更 さ れ る か ど う か は 不 定 で あ る 。

エ ラ ー

EAGAIN

フ ァ イ ル デ ィ ス ク リ プ タ ー fd が ソ ケ ッ ト 以 外 の フ ァ イ ル を 参 照 し て い て 、 非 停 止 (nonblocking) モ ー ド ( O_NONBLOCK ) に 設 定 さ れ て お り 、 読 み 込 み を 行 う と 停 止 す る 状 況 に あ る 。 O_NONBLOCK フ ラ グ の 詳 細 は open (2) を 参 照 。

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

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

EIO

I/O error. This will happen for example when the process is in a background process group, tries to read from its controlling terminal, and either it is ignoring or blocking SIGTTIN or its process group is orphaned. It may also occur when there is a low-level I/O error while reading from a disk or tape. A further possible cause of EIO on networked filesystems is when an advisory lock had been taken out on the file descriptor and this lock has been lost. See the Lost locks section of fcntl (2) for further details.

EISDIR

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

fd に 接 続 さ れ た オ ブ ジ ェ ク ト に よ っ て は 、 他 の エ ラ ー が 起 こ る か も し れ な い 。

準 拠

SVr4, 4.3BSD, POSIX.1-2001.

注 意

The types size_t and ssize_t are, respectively, unsigned and signed integer data types specified by POSIX.1.

On Linux, read () (and similar system calls) will transfer at most 0x7ffff000 (2,147,479,552) bytes, returning the number of bytes actually transferred. (This is true on both 32-bit and 64-bit systems.)

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 プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。