函數(shù)名:
read - 從文件描述字中讀
摘要:
1 #include <unistd.h>
2
3 ssize_t read(int fd, void* buf, size_t cnt);
描述: read()試圖從文件描述字fd中讀取cnt字節(jié)到以buf開始的緩沖區(qū)中。
如果cnt為0,read()返回0并且buf中沒有結果;如果cnt大于SSIZE_MAX,結果為定義。
返回值: 如果成功,返回讀取的字節(jié)數(shù)`ret'(非負,0代表遇到了文件結束符),并且文件位置前移ret字節(jié)。如果ret<cnt并不代表出錯;例如,這種情況可能是由于當前只有ret字節(jié)可用(可能是因為已經(jīng)接近文件結束,或者因為我們正從管道或終端中讀取),也可能由于read()被信號中斷。如果出錯,返回-1。在這種情況下,文件位置是否改變是未定義行為。
錯誤號: EINTR 該調用在讀完數(shù)據(jù)之前被信號中斷。
EAGAIN 用O_NONBLOCK選擇了非阻塞模式I/O,但是當前沒有數(shù)據(jù)可用。
EIO I/O錯誤。例如這種情況可能發(fā)生在當前進程為后臺運行組,試圖從它所控制的tty中讀取,但是該終端為當前無效或者屏蔽了SIGTTIN信號又或者該終端進程為“孤兒進程”(orphan process)。 當從磁盤中讀取數(shù)據(jù)時遇到底層I/O錯誤時,也會發(fā)生這種情況。
EISDIR fd引用了一個目錄。
EBADF fd不是有效文件描述字,或者沒有為讀打開。
EINVAL fd引用了一個不支持讀操作的設備。
EFAULT buf超出了可訪問地址空間。
其他錯誤也會發(fā)生,這取決于fd所連接的設備。 POSIX允許read調用在讀取部分數(shù)據(jù)后被信號中斷后,或者返回-1(錯誤號被置為EINTR),或者返回已經(jīng)讀取的字節(jié)數(shù)。
規(guī)范: SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3
約束:
在NFS文件系統(tǒng)中,讀取小量數(shù)據(jù)只在第一次時更新時間戳,而后續(xù)調用不會更新。這是由客戶端屬性緩存(client side attribute caching)導致的,因為絕大多數(shù)NFS客戶端讓server維護atime(最后訪問時間),而客戶端read調用所產(chǎn)生的讀操作沒有造成server端的讀操作從而也不會導致server更新atime。可以通過禁用客戶端屬性緩存以獲得UNIX語義,但事實證明大多數(shù)情況下這會增加server負載并降低性能。
參考:
close(2), fcntl(2), ioctl(2), lseek(2), readdir(2), readlink(2), select(2), write(2), fread(3), readv(3)