read() - Unix、Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於 TP  

read() - Unix、Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

read - 從檔案描述符讀取

語法

#include <unistd.h> 

ssize_t read(int fd, void *buf, size_t count);

描述

read() 嘗試從檔案描述符 fd 讀取最多 count 個位元組到以 buf 開頭的緩衝區中。

如果 count 為零,read() 返回零且沒有其他結果。如果 count 大於 SSIZE_MAX,則結果未定義。

返回值

成功時,返回讀取的位元組數(零表示檔案結束),檔案位置將向前移動此數量。如果此數字小於請求的位元組數,則不視為錯誤;例如,這可能發生是因為現在實際可用的位元組數較少(可能是因為我們接近檔案末尾,或者因為我們正在從管道或終端讀取),或者因為 read() 被訊號中斷。出錯時,返回 -1,並適當地設定 errno。在這種情況下,檔案位置(如果有)是否更改是未指定的。

錯誤

標籤描述
EAGAIN 使用 O_NONBLOCK 選擇了非阻塞 I/O,並且沒有立即可用於讀取的資料。
EBADF fd 不是有效的檔案描述符,或者未開啟以供讀取。
EFAULT buf 位於您可訪問的地址空間之外。
EINTR 在讀取任何資料之前,呼叫被訊號中斷。
EINVAL fd 附加到不適合讀取的物件;或者檔案以 O_DIRECT 標誌開啟,並且 buf 中指定的地址、count 中指定的值或當前檔案偏移量未正確對齊。
EIO I/O 錯誤。例如,當程序位於後臺程序組中,嘗試從其控制終端讀取,並且它正在忽略或阻止 SIGTTIN 或其程序組已成為孤兒時,將發生這種情況。當從磁碟或磁帶讀取時出現低階 I/O 錯誤時,也可能發生這種情況。
EISDIR fd 指向一個目錄。
可能會發生其他錯誤,具體取決於連線到 fd 的物件。POSIX 允許在讀取一些資料後被中斷的 read() 返回 -1(將 errno 設定為 EINTR)或返回已讀取的位元組數。

符合標準

SVr4、4.3BSD、POSIX.1-2001。

限制

在 NFS 檔案系統上,讀取少量資料只會第一次更新時間戳,後續呼叫可能不會這樣做。這是由客戶端屬性快取引起的,因為大多數(如果不是全部)NFS 客戶端將 st_atime(上次檔案訪問時間)更新留給伺服器,並且從客戶端快取中滿足的客戶端讀取不會導致伺服器上的 st_atime 更新,因為沒有伺服器端讀取。可以透過停用客戶端屬性快取來獲得 UNIX 語義,但在大多數情況下,這會大大增加伺服器負載並降低效能。

許多檔案系統和磁碟被認為足夠快,因此 O_NONBLOCK 的實現被認為是不必要的。因此,O_NONBLOCK 可能在檔案和/或磁碟上不可用。

參見



previous next Printer Friendly

廣告


  

廣告



廣告
© . All rights reserved.