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


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

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於 TP  

writev() - 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

廣告


  

廣告



廣告