简介I/O向量、sendv、writev
生活随笔
收集整理的這篇文章主要介紹了
简介I/O向量、sendv、writev
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ? 在我們了解使用附屬數(shù)據(jù)工作的復雜函數(shù)之前,我們應該熟悉被readv(2)與writev(2)系統(tǒng)調(diào)用所使用的I/O向量。我們不僅將會發(fā)現(xiàn)這些函數(shù)是十分有用的,而他們的工作方式也被引入了一些附屬數(shù)據(jù)函數(shù)中。這會使得后面的理解更為容易。
I/O向量(struct iovec)
readv(2)與writev(2)函數(shù)都使用一個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定義了一個向量元素。通常,這個結(jié)構(gòu)用作一個多元素的數(shù)組。對于每一個傳輸?shù)脑?#xff0c;指針成員iov_base指向一個緩沖區(qū),這個緩沖區(qū)是存放
的是readv所接收的數(shù)據(jù)或是writev將要發(fā)送的數(shù)據(jù)。成員iov_len在各種情況下分別確定了接收的最大長度以及實際寫入的長度。
readv(2)與writev(2)函數(shù)
這些函數(shù)是作為read與write函數(shù)的衍生函數(shù)而被人所知的。他們以這樣的方式進行設計是因為他們可以在一個原子操作中讀取或是寫入多個緩沖區(qū)。這些函數(shù)的原型如下:
#include?
int readv(int fd, const struct iovec *vector, int count);
int writev(int fd, const struct iovec *vector, int count);
這些函數(shù)需要三個參數(shù):
要在其上進行讀或是寫的文件描述符fd
讀或?qū)懰玫腎/O向量(vector)
要使用的向量元素個數(shù)(count)
這些函數(shù)的返回值是readv所讀取的字節(jié)數(shù)或是writev所寫入的字節(jié)數(shù)。如果有錯誤發(fā)生,就會返回-1,而errno存有錯誤代碼。注意,也其他I/O函數(shù)類似,可以返回錯誤碼EINTR來表明他被一個信號所中斷。
使用writev的例子
下面的程序代碼展示了如何使用writev函數(shù)將三個獨立的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]
$
當程序運行時,我們可以看到無論所引用的緩沖區(qū)是如何分散,所有的緩沖區(qū)都會被輸出形成最終的字符串。
也許我們希望多花一些時間來修改這個程序并做各種測試,但是要注意一定要將iov[[]數(shù)組分配得足夠大。
I/O向量(struct iovec)
readv(2)與writev(2)函數(shù)都使用一個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定義了一個向量元素。通常,這個結(jié)構(gòu)用作一個多元素的數(shù)組。對于每一個傳輸?shù)脑?#xff0c;指針成員iov_base指向一個緩沖區(qū),這個緩沖區(qū)是存放
的是readv所接收的數(shù)據(jù)或是writev將要發(fā)送的數(shù)據(jù)。成員iov_len在各種情況下分別確定了接收的最大長度以及實際寫入的長度。
readv(2)與writev(2)函數(shù)
這些函數(shù)是作為read與write函數(shù)的衍生函數(shù)而被人所知的。他們以這樣的方式進行設計是因為他們可以在一個原子操作中讀取或是寫入多個緩沖區(qū)。這些函數(shù)的原型如下:
#include?
int readv(int fd, const struct iovec *vector, int count);
int writev(int fd, const struct iovec *vector, int count);
這些函數(shù)需要三個參數(shù):
要在其上進行讀或是寫的文件描述符fd
讀或?qū)懰玫腎/O向量(vector)
要使用的向量元素個數(shù)(count)
這些函數(shù)的返回值是readv所讀取的字節(jié)數(shù)或是writev所寫入的字節(jié)數(shù)。如果有錯誤發(fā)生,就會返回-1,而errno存有錯誤代碼。注意,也其他I/O函數(shù)類似,可以返回錯誤碼EINTR來表明他被一個信號所中斷。
使用writev的例子
下面的程序代碼展示了如何使用writev函數(shù)將三個獨立的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]
$
當程序運行時,我們可以看到無論所引用的緩沖區(qū)是如何分散,所有的緩沖區(qū)都會被輸出形成最終的字符串。
也許我們希望多花一些時間來修改這個程序并做各種測試,但是要注意一定要將iov[[]數(shù)組分配得足夠大。
總結(jié)
以上是生活随笔為你收集整理的简介I/O向量、sendv、writev的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网日报 | 3月12日 星期五 |
- 下一篇: B站2021品牌营销手册