高級I/O之readv和writev函數


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

#include <sys/uio.h>
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 {
    void      *iov_base;      /* starting address of buffer */
    size_t    iov_len;        /* size of buffer */
};

iov數組中的元素數由iovcnt說明。其最大值受限於IOV_MAX(參見http://www.cnblogs.com/nufangrensheng/p/3496323.html中的表5)。圖14-10顯示了readv和writev的參數和iovec結構。

20140126110606937

                                           圖14-10 readv和writev的iovec結構

writev以順序iov[0],iov[1]至iov[iovcnt-1]從緩沖區中聚集輸出數據。writev返回輸出的字節總數,通常,它應等於所有緩沖區長度之和。

readv則將讀入的數據按上述同樣順序散布到緩沖區中。readv總是先填滿一個緩沖區,然后再填寫下一個。readv返回讀到的總字節數。如果遇到文件結尾,已無數據可讀,則返回0。

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關於本書可參考:http://www.apuebook.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM