Manpages

NAME

read - 在 文 件 描 述 符 上 执 行 读 操 作

概 述

#include <unistd.h>

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

描 述

read() 从 文 件 描 述 符 fd 中 读 取 count 字 节 的 数 据 并 放 入 从 buf 开 始 的 缓 冲 区 中 . 如 果 count 为 零 ,read()返 回 0,不 执 行 其 他 任 何 操 作 . 如 果 count 大 于 SSIZE_MAX,那 么 结 果 将 不 可 预 料 .

返 回 值

成 功 时 返 回 读 取 到 的 字 节 数 (为 零 表 示 读 到 文 件 描 述 符 ), 此 返 回 值 受 文 件 剩 余 字 节 数 限 制 .当 返 回 值 小 于 指 定 的 字 节 数 时 并 不 意 味 着 错 误 ;这 可 能 是 因 为 当 前 可 读 取 的 字 节 数 小 于 指 定 的 字 节 数 (比 如 已 经 接 近 文 件 结 尾 ,或 者 正 在 从 管 道 或 者 终 端 读 取 数 据 ,或 者 read()被 信 号 中 断 ). 发 生 错 误 时 返 回 -1,并 置 errno 为 相 应 值 .在 这 种 情 况 下 无 法 得 知 文 件 偏 移 位 置 是 否 有 变 化 .

错 误 代 码

EINTR 在 读 取 到 数 据 以 前 调 用 被 信 号 所 中 断

.

EAGAIN 使 用

O_NONBLOCK 标 志 指 定 了 非 阻 塞 式 输 入 输 出 ,但 当 前 没 有 数 据 可 读 .

EIO 输 入 输 出 错 误

.可 能 是 正 处 于 后 台 进 程 组 进 程 试 图 读 取 其 控 制 终 端 ,但 读

操 作 无 效 ,或 者 被 信 号 SIGTTIN所 阻 塞 , 或 者 其 进 程 组 是 孤 儿 进 程 组 .也 可 能 执 行 的 是 读 磁 盘 或 者 磁 带 机 这 样 的 底 层 输 入 输 出 错 误 .

EISDIR

fd 指 向 一 个 目 录 .

EBADF

fd 不 是 一 个 合 法 的 文 件 描 述 符 ,或 者 不 是 为 读 操 作 而 打 开 .

EINVAL

fd 所 连 接 的 对 象 不 可 读 .

EFAULT

buf 超 出 用 户 可 访 问 的 地 址 空 间 .

也 可 能 发 生 其 他 错 误 ,具 体 情 况 和 fd 所 连 接 的 对 象 有 关 . POSIX 允 许 read 在 读 取 了 一 定 量 的 数 据 后 被 信 号 所 中 断 ,并 返 回 -1(且 errno 被 设 置 为 EINTR),或 者 返 回 已 读 取 的 数 据 量 .

兼 容 于

SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3

限 制

在 NFS文 件 系 统 中 ,读 取 小 块 数 据 仅 更 新 时 间 标 记 ,之 后 的 调 用 不 再 读 取 服 务 器 端 的 数 据 .这 是 因 为 客 户 端 把 数 据 放 在 缓 存 里 . 由 于 大 多 数 情 况 下 不 存 在 NFS服 务 器 向 客 户 端 的 读 操 作 , 所 以 NFS客 户 必 须 将 更 新 时 间 标 记 的 操 作 放 在 服 务 器 端 ,而 数 据 可 以 放 在 客 户 端 的 缓 存 里 留 待 以 后 更 新 .UNIX也 可 以 禁 用 客 户 端 的 缓 存 ,但 那 样 的 话 大 多 数 情 况 下 会 导 致 服 务 器 性 能 下 降 .

参 见

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

[中 文 版 维 护 人 ]

byeyear <love_my_love [AT] 263.net >

[中 文 版 最 新 更 新 ]

2002.02.02

《 中 国 linux论 坛 man手 册 页 翻 译 计 划 》 :

http://cmpp.linuxforum.net

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh