linux 讀取函數read

名字
    read 從一個文件描述符中讀取
概要
    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);
描述
    read() 嘗試從文件描述符中讀取多達count個字節到buf指向的緩衝裏面。
    如果count是0,read()返回0並沒有其他的結果。如果count比SSIZE_MAX大,則結果未指定
返回值
    成功的話,返回讀取的字節數(0意味着文件結束),文件位置要加上這個數。如果這個數比請求的字節數少這也並不是錯誤;這可能是因爲例如實際上當前沒有那麼多字節可以讀取,或者read函數被一個信號中斷了。錯誤的話,返回-1,errno被正確的設置。這種情況下文件的位置是否改變未指定。
錯誤值
    EAGAIN     文件描述符指向一個socket以外的文件,並被標誌爲非阻塞,read阻塞了。
    EAGAIN 或者 EWOULDBLOCK
    文件描述符指向socket並標識了非阻塞,read函數阻塞了。
    EBADF fd不是一個有效的描述符或者沒有打開
    EFAULT buf超出了可用的地址空間
    EINTR 調用在數據被讀之前被信號中斷了。
    EINVAL fd附加到了一個不適合讀取的對象上;或者文件被以O_DIRECT標誌打開了,要不就是指定的緩衝地址/count/當前文件便宜沒有恰當的對齊。
    EIO I/O錯誤。
    EISDIR fd指向了一個目錄。
    在NFS文件系統,讀取少量的數據將只在第一次更新時間戳,隨後的調用可能不會這樣做。這是大多數客戶端屬性緩存引起的,因爲不是所有的NFS客戶端把st_atime(最後文件的訪問時間)更新到服務器,客戶端從客戶端的緩存完美的讀取不會把st_atime更新到取服務器上因爲有沒有服務器端的讀取。 UNIX語義可以獲得通過禁用客戶端屬性緩存,但在大多數情況下,這將大大增加服務器的負載,降低性能。許多文件系統和磁盤被認爲是夠快以至於O_NONBLOCK的實現被認爲是不必要的。因此,O_NONBLOCK可能無法使用在文件和/或磁盤上。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章