iovec結構體定義及使用

工程師WWW發表於2013-11-25
I/O向量(struct iovec)

readv(2)與writev(2)函式都使用一個I/O向量的概念。這是由所包含的檔案定義的:
#include <sys/uio.h>
標頭檔案定義了struct iovec,其定義如下:
struct iovec {
    ptr_t iov_base; /* Starting address */
    size_t iov_len; /* Length in bytes */
};
struct iovec定義了一個向量元素。通常,這個結構用作一個多元素的陣列。對於每一個傳輸的元素,指標成員iov_base指向一個緩衝區,這個緩衝區是存放的是readv所接收的資料或是writev將要傳送的資料。成員iov_len在各種情況下分別確定了接收的最大長度以及實際寫入的長度。

readv(2)與writev(2)函式這些函式是作為read與write函式的衍生函式而被人所知的。他們以這樣的方式進行設計是因為他們可以
在一個原子操作中讀取或是寫入多個緩衝區。這些函式的原型如下:
#include 
int readv(int fd, const struct iovec *vector, int count);
int writev(int fd, const struct iovec *vector, int count);
這些函式需要三個引數:
        要在其上進行讀或是寫的檔案描述符fd
        讀或寫所用的I/O向量(vector)
        要使用的向量元素個數(count)
這些函式的返回值是readv所讀取的位元組數或是writev所寫入的位元組數。如果有錯誤發生,就會返回-1,而errno存有錯誤程式碼。注意,也其他I/O函式類似,可以返回錯誤碼EINTR來表明他被一個訊號所中斷。

使用writev的例子
下面的程式程式碼展示瞭如何使用writev函式將三個獨立的C字串作為一次寫操作寫入標準輸出。
/*
* writev.c
*
* Short writev(2) demo:
*/
#include <sys/uio.h>
int main(int argc,char **argv)
{
    static char part2[] = "THIS IS FROM WRITEV";
    static char part3[]    = "]\n";
    static char part1[] = "[";
    struct iovec iov[3];
    iov[0].iov_base = part1;
    iov[0].iov_len = strlen(part1);
    iov[1].iov_base = part2;
    iov[1].iov_len = strlen(part2);
    iov[2].iov_base = part3;
    iov[2].iov_len = strlen(part3);
    writev(1,iov,3);
    return 0;
}

相關文章