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結構。
圖14-10 readv和writev的iovec結構
writev以順序iov[0],iov[1]至iov[iovcnt-1]從緩沖區中聚集輸出數據。writev返回輸出的字節總數,通常,它應等於所有緩沖區長度之和。
readv則將讀入的數據按上述同樣順序散布到緩沖區中。readv總是先填滿一個緩沖區,然后再填寫下一個。readv返回讀到的總字節數。如果遇到文件結尾,已無數據可讀,則返回0。
本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關於本書可參考:http://www.apuebook.com/。