readv() - Unix,Linux 系統呼叫
廣告
名稱
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 庫中的函式;結果將是未定義的,並且可能不是您想要的。
參見
廣告
|