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