readv() - Unix,Linux 系統呼叫 - 技術教學
Tutorials Point


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

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於 TP  

readv() - Unix,Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

readv、writev - 讀取或寫入資料到多個緩衝區

語法

#include <sys/uio.h> 

ssize_t readv(int fd, const struct iovec *vector, int count);

ssize_t writev(int fd, const struct iovec *vector, int count);

描述

readv() 函式從與檔案描述符 fd 關聯的檔案中讀取 count 個塊到由 vector 描述的多個緩衝區中。

writev() 函式最多將由 vector 描述的 count 個塊寫入與檔案描述符 fd 關聯的檔案。

指標 vector 指向一個 struct iovec 結構體,該結構體在 <sys/uio.h> 中定義為

struct iovec {
    void *iov_base;   /* Starting address */
    size_t iov_len;   /* Number of bytes */
};

緩衝區按指定的順序處理。readv() 函式的工作方式與 read(2) 相同,只是填充了多個緩衝區。

writev() 函式的工作方式與 write(2) 相同,只是寫出了多個緩衝區。

返回值

成功時,readv() 函式返回讀取的位元組數;writev() 函式返回寫入的位元組數。錯誤時,返回 -1,並且 errno 被相應地設定。

錯誤

錯誤與 read(2) 和 write(2) 中給出的相同。此外,還定義了以下錯誤

標籤描述
EINVAL iov_len 值的總和超過了 ssize_t 值。或者,向量計數 count 小於零或大於允許的最大值。

符合標準

4.4BSD(readv() 和 writev() 函式首次出現在 4.2BSD 中),POSIX.1-2001。Linux libc5 使用 size_t 作為 count 引數的型別,並使用 int 作為這些函式的返回型別。

Linux 說明

POSIX.1-2001 允許實現對可以傳遞到 vector 中的專案數量設定限制。實現可以透過在 <limits.h> 中定義 IOV_MAX 或在執行時透過 sysconf(_SC_IOV_MAX) 的返回值來宣傳其限制。在 Linux 上,這些機制宣傳的限制為 1024,這是真正的核心限制。

但是,如果 glibc 包裝函式檢測到底層核心系統呼叫失敗是因為此限制被超過,則會執行一些額外的工作。在 readv() 的情況下,包裝函式會分配一個足夠大的臨時緩衝區來容納 vector 指定的所有專案,將該緩衝區傳遞給 read() 的呼叫,將資料從緩衝區複製到 vector 元素的 iov_base 欄位指定的位置,然後釋放緩衝區。

writev() 的包裝函式使用臨時緩衝區和對 write() 的呼叫執行類似的任務。

錯誤

不建議混合使用諸如 readv() 或 writev() 之類的在檔案描述符上操作的函式與 stdio 庫中的函式;結果將是未定義的,並且可能不是您想要的。

參見



previous next Printer Friendly

廣告


  

廣告



廣告