高級I/O之readv和writev函數

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

#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返回輸出的字節總數,一般,它應等於全部緩衝區長度之和。ui

readv則將讀入的數據按上述一樣順序散佈到緩衝區中。readv老是先填滿一個緩衝區,而後再填寫下一個。readv返回讀到的總字節數。若是遇到文件結尾,已無數據可讀,則返回0。spa

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

相關文章
相關標籤/搜索