read 中文man頁面
NAME
read - 在文件描述符上執(zhí)行讀操作
概述
#include <unistd.h> ssize_t read(int fd, void *buf, size_t count);
描述
read() 從文件描述符 fd 中讀取 count 字節(jié)的數(shù)據(jù)并放入從 buf 開始的緩沖區(qū)中.
如果 count 為零,read()返回0,不執(zhí)行其他任何操作. 如果 count 大于SSIZE_MAX,那么結(jié)果將不可預(yù)料.
返回值
成功時(shí)返回讀取到的字節(jié)數(shù)(為零表示讀到文件描述符), 此返回值受文件剩余字節(jié)數(shù)限制.當(dāng)返回值小于指定的字節(jié)數(shù)時(shí)并不意味著錯(cuò)誤;這可能是因?yàn)楫?dāng)前可讀取的字節(jié)數(shù)小于指定的字節(jié)數(shù)(比如已經(jīng)接近文件結(jié)尾,或者正在從管道或者終端讀取數(shù)據(jù),或者 read()被信號中斷). 發(fā)生錯(cuò)誤時(shí)返回-1,并置 errno 為相應(yīng)值.在這種情況下無法得知文件偏移位置是否有變化.
錯(cuò)誤代碼
- EINTR
- 在讀取到數(shù)據(jù)以前調(diào)用被信號所中斷.
- EAGAIN
- 使用 O_NONBLOCK 標(biāo)志指定了非阻塞式輸入輸出,但當(dāng)前沒有數(shù)據(jù)可讀.
- EIO
- 輸入輸出錯(cuò)誤.可能是正處于后臺進(jìn)程組進(jìn)程試圖讀取其控制終端,但讀操作無效,或者被信號SIGTTIN所阻塞, 或者其進(jìn)程組是孤兒進(jìn)程組.也可能執(zhí)行的是讀磁盤或者磁帶機(jī)這樣的底層輸入輸出錯(cuò)誤.
- EISDIR
- fd 指向一個(gè)目錄.
- EBADF
- fd 不是一個(gè)合法的文件描述符,或者不是為讀操作而打開.
- EINVAL
- fd 所連接的對象不可讀.
- EFAULT
- buf 超出用戶可訪問的地址空間.
也可能發(fā)生其他錯(cuò)誤,具體情況和 fd 所連接的對象有關(guān). POSIX 允許 read 在讀取了一定量的數(shù)據(jù)后被信號所中斷,并返回 -1(且 errno 被設(shè)置為EINTR),或者返回已讀取的數(shù)據(jù)量.
兼容于
SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3
限制
在NFS文件系統(tǒng)中,讀取小塊數(shù)據(jù)僅更新時(shí)間標(biāo)記,之后的調(diào)用不再讀取服務(wù)器端的數(shù)據(jù).這是因?yàn)榭蛻舳税褦?shù)據(jù)放在緩存里. 由于大多數(shù)情況下不存在NFS服務(wù)器向客戶端的讀操作, 所以NFS客戶必須將更新時(shí)間標(biāo)記的操作放在服務(wù)器端,而數(shù)據(jù)可以放在客戶端的緩存里留待以后更新.UNIX也可以禁用客戶端的緩存,但那樣的話大多數(shù)情況下會導(dǎo)致服務(wù)器性能下降.
參見
close(2), fcntl(2), ioctl(2), lseek(2), readdir(2), readlink(2), select(2), write(2), fread(3)
#p#
NAME
read - read from a file descriptor
SYNOPSIS
#include <unistd.h> ssize_t read(int fd, void *buf, size_t count);
DESCRIPTION
read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf.
If count is zero, read() returns zero and has no other results. If count is greater than SSIZE_MAX, the result is unspecified.
RETURN VALUE
On success, the number of bytes read is returned (zero indicates end of file), and the file position is advanced by this number. It is not an error if this number is smaller than the number of bytes requested; this may happen for example because fewer bytes are actually available right now (maybe because we were close to end-of-file, or because we are reading from a pipe, or from a terminal), or because read() was interrupted by a signal. On error, -1 is returned, and errno is set appropriately. In this case it is left unspecified whether the file position (if any) changes.
ERRORS
- EINTR
- The call was interrupted by a signal before any data was read.
- EAGAIN
- Non-blocking I/O has been selected using O_NONBLOCK and no data was immediately available for reading.
- EIO
- I/O error. This will happen for example when the process is in a background process group, tries to read from its controlling tty, 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.
- EISDIR
- fd refers to a directory.
- EBADF
- fd is not a valid file descriptor or is not open for reading.
- EINVAL
- fd is attached to an object which is unsuitable for reading.
- EFAULT
- buf is outside your accessible address space.
Other errors may occur, depending on the object connected to fd. POSIX allows a read that is interrupted after reading some data to return -1 (with errno set to EINTR) or to return the number of bytes already read.
CONFORMING TO
SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3
RESTRICTIONS
On NFS file systems, reading small amounts of data will only update the time stamp the first time, subsequent calls may not do so. This is caused by client side attribute caching, because most if not all NFS clients leave atime updates to the server and client side reads satisfied from the client's cache will not cause atime updates on the server as there are no server side reads. UNIX semantics can be obtained by disabling client side attribute caching, but in most situations this will substantially increase server load and decrease performance.
Many filesystems and disks were considered to be fast enough that the implementation of O_NONBLOCK was deemed unneccesary. So, O_NONBLOCK may not be available on files and/or disks.
SEE ALSO
close(2), fcntl(2), ioctl(2), lseek(2), readdir(2), readlink(2), select(2), write(2), fread(3), readv(3)

















