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 <[email protected] >
2002.02.02
http://cmpp.linuxforum.net
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh