簡介I/O向量、sendv、writev

來源:互聯網
上載者:User

    在我們瞭解使用附屬資料工作的複雜函數之前,我們應該熟悉被readv(2)與writev(2)系統調用所使用的I/O向量。我們不僅將會發現這些函數是十分有用的,而他們的工作方式也被引入了一些附屬資料函數中。這會使得後面的理解更為容易。
I/O向量(struct iovec)
readv(2)與writev(2)函數都使用一個I/O向量的概念。這是由所包含的檔案定義的:
#include 
sys/uio.h標頭檔定義了struct iovc,其定義如下:
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 
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;
}
編譯運行程式:
$ make writev
gcc -g -c -D_GNU_SOURCE -Wall -Wreturn-type writev.c
gcc writev.o -o writev
$ ./writev
[THIS IS FROM WRITEV]
$
當程式運行時,我們可以看到無論所引用的緩衝區是如何分散,所有的緩衝區都會被輸出形成最終的字串。
也許我們希望多花一些時間來修改這個程式並做各種測試,但是要注意一定要將iov[[]數組分配得足夠大。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.