高階I O之readv和writev函式

2021-09-08 17:07:22 字數 1068 閱讀 4971

readv和writev函式用於在一次函式呼叫中讀、寫多個非連續緩衝區。有時也將這兩個函式稱為散布讀(scatter read)和聚集寫(gather write)。

#include ssize_t readv(

int filedes, const

struct iovec *iov, int

iovcnt);

ssize_t writev(

int filedes, const

struct iovec *iov, int

iovcnt);

兩個函式的返回值:若成功則返回已讀、寫的位元組數,若出錯則返回-1

這兩個函式的第二個引數是指向iovec結構陣列的乙個指標:

注:關於上面兩個函式中第二個引數的說明,個人感覺是有問題的,const struct iovec (*iov),這樣寫的話iov才是乙個指向iovec結構資料的指標。而上面函式中第二個引數明明是乙個指向iovec結構的指標。

struct

iovec ;

iov陣列中的元素數由iovcnt說明。其最大值受限於iov_max(參見中的表5)。圖14-10顯示了readv和writev的引數和iovec結構。

圖14-10 readv和writev的iovec結構

writev以順序iov[0],iov[1]至iov[iovcnt-1]從緩衝區中聚集輸出資料。writev返回輸出的位元組總數,通常,它應等於所有緩衝區長度之和。

readv則將讀入的資料按上述同樣順序散布到緩衝區中。readv總是先填滿乙個緩衝區,然後再填寫下乙個。readv返回讀到的總位元組數。如果遇到檔案結尾,已無資料可讀,則返回0。

本篇博文內容摘自《unix環境高階程式設計》(第二版),僅作個人學習記錄所用。關於本書可參考:

78 高階IO之非阻塞IO

高階io是相對於檔案io說的 檔案io,就是讀寫檔案,一切皆是檔案 高階io要解決讀寫以外的情況 阻塞式 函式呼叫會被卡住 雖然會釋放cpu的使用權,但是 不會往下走 核心會在此處掛起,好多預設的程式都是阻塞式的,常見的阻塞式的函式,sleep,wait,pause等,阻塞式在多路io的時候會有問題...

高階I O函式之sendfile函式

sendfile函式在兩個檔案描述符之間傳遞資料 完全在核心中操作 從而避免了核心緩衝區和使用者緩衝區之間的資料拷貝,效率很高,被稱為零拷貝。函式定義為 include ssize t senfile int out fd,int in fd,off t offset,size t count in...

linux程式設計主題之標準I O與高階I O

對於標準i o庫,它們的操作是圍繞流進行的。當用標準i o庫開啟或建立乙個檔案時,我們已使乙個流與乙個檔案相關聯。對乙個程序預定義了三個流,並且這三個流可以自動地被程序使用,它們是 標準輸入 標準輸出和標準出錯,對應的檔案指標分別為stdin stdout和stderr。為了減少使用read和wri...