天天看點

readv及writev1. 函數原型 2. readv3. writev4. 使用場景5. 總結

1. 函數原型 

#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
           
struct iovec {
       void  *iov_base;    /* Starting address */
       size_t iov_len;      /* Number of bytes to transfer */
};
           

2. readv

        功能:從檔案描述符fd關聯的檔案中讀取資料到iov指向的buffer中。

        描述:iov辨別的buffer是iovec結構體類型數組,iovcnt訓示數組最大長度。讀取時,按數組順序存儲資料,即iov[0]先于iov[1],如果資料量不夠存滿整個數組,位置滞後的空間将不存儲。

        readv屬于原子操作。

        傳回讀取位元組數,讀取失敗傳回-1。

3. writev

        功能:writev相對于readv就相當于write對于read,把iov指向的數組空間中的内容寫入fd關聯的檔案,同樣也是原子操作。

        傳回寫入位元組數,寫入失敗傳回-1。

4. 使用場景

        以writev為例,在實作http伺服器時,傳回響應封包需要準備的資料有:響應行、響應頭、響應空行、響應體。通常的處理方式為:将前三者放入同一寫緩存空間,而響應體可能是用戶端請求的一個檔案,自然屬于單一的緩存空間。對于這種情況,就可以使用writev同時處理兩塊buffer,且writev是按序處理,可以自然的把響應體放到最後。

5. 總結

          readv和writev,相比于read和write函數隻是多了對多個buffer操作的能力。當要将一個連續區域資料寫入檔案時,使用write()即可,但當要将多個不同區域資料寫入檔案時,則使用writev()更為友善。

繼續閱讀