iovec结构体定义及使用 (转)

I/O向量(struct iovec)

readv(2)与writev(2)函数都使用一个I/O向量的概念。这是由所包含的文件定义的:

#include <sys/uio.h>

头文件定义了struct iovc,其定义如下:

1 struct iovec {
2     ptr_t iov_base; /* Starting address */
3     size_t iov_len; /* Length in bytes */
4 };

struct iovec定义了一个向量元素。通常,这个结构用作一个多元素的数组。对于每一个传输的元素,指针成员iov_base指向一个缓冲区,这个缓冲区是存放的是readv所接收的数据或是writev将要发送的数据。成员iov_len在各种情况下分别确定了接收的最大长度以及实际写入的长度。

readv(2)与writev(2)函数这些函数是作为read与write函数的衍生函数而被人所知的。他们以这样的方式进行设计是因为他们可以在一个原子操作中读取或是写入多个缓冲区。这些函数的原型如下:
#include

1 int readv(int fd, const struct iovec *vector, int count);
2 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字符串作为一次写操作写入标准输出。

 1 /*
 2 * writev.c
 3 *
 4 * Short writev(2) demo:
 5 */
 6 #include
 7 int main(int argc,char **argv)
 8 {
 9     static char part2[] = "THIS IS FROM WRITEV";
10     static char part3[]    = "]\n";
11     static char part1[] = "[";
12     struct iovec iov[3];
13     iov[0].iov_base = part1;
14     iov[0].iov_len = strlen(part1);
15     iov[1].iov_base = part2;
16     iov[1].iov_len = strlen(part2);
17     iov[2].iov_base = part3;
18     iov[2].iov_len = strlen(part3);
19     writev(1,iov,3);
20     return 0;
21 }
时间: 2024-10-30 10:11:45

iovec结构体定义及使用 (转)的相关文章

结构体定义 typedef struct 用法详解和用法小结

typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,struct node n;若用typedef,可以这样写,typedef struct node{}NODE; .在申请变量时就可以这样写,NODE n;区别就在于使用时,是否可以省去struct这个关键字. 第三篇:struct和typedef struct 分三块来讲述:1 首先:在C中定义一个结构体

《从零开始学Swift》学习笔记(Day 25)——类和结构体定义

原创文章,欢迎转载.转载请注明:关东升的博客  Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 {     定义类的成员 } struct 结构体名 {     定义结构体的成员 } 从语法格式上看,Swift中的类和结构体的定义更类似于Java语法,不需要像C++和Objective-C那样把接口部分和实现部分放到不同的文件中. 下面来看一个示例: class Employee {     

Swift 2.0学习笔记(Day 25)——类和结构体定义

原创文章,欢迎转载.转载请注明:关东升的博客 Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { 定义类的成员 } struct 结构体名 { 定义结构体的成员 } 从语法格式上看,Swift中的类和结构体的定义更类似于Java语法,不需要像C++和Objective-C那样把接口部分和实现部分放到不同的文件中. 下面来看一个示例: class Employee { //定义的类 var no

Swift类和结构体定义-备

Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { 定义类的成员 } struct 结构体名 { 定义结构体的成员 } 从语法格式上看,Swift中的类和结构体的定义更类似于Java语法,不需要像C++和Objective-C那样把接口部分和实现部分放到不同的文件中. 下面来看一个示例: class Employee {             //定义的类 var no: Int = 0 v

关于物体 &#39;固有类别&#39; 与 &#39;实际使用类别&#39; 分离的情况,结构体定义方法

在面向接口.面向对象编程的过程中,会遇到实际物体类别与定义类别相分离的情况. 例如,我们有三种物体,他们的固有类别分别为: TYPEA,TYPEB,TYPEC.在我们实际使用过程中,我们会根据不同的情况将他们分成 2 组: Group1,Group2. 那么,我们在定义结构体和物理类别时,需要注意对 Group 进行定义.定义物体具体属性和结构体如下: #define TYPEA (0x01UL << 0) #define TYPEB (0x01UL << 1) #define T

C#中结构体定义并转换字节数组

最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一点非常重要. 首先是结构体定义,一些基本的数据类型,C#与C++都是可以匹配的: [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] public struct Head { public

C语言结构体定义的几种方法

什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据结构.结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问. 结构体的定义: C语言结构体类型的定义模板大概为: struct 类型名{ 成员表列 } 变量; 在成员表列中可以是几种基本数据类型,也可以是结构体类型. struct 类

go 结构体定义和结构体指针

结构体一个结构体(`struct`)就是一个字段的集合. 将来要使用它向java .C# 中的class 有相同的地位 struct 可以用来值传递 同时可以通过引用传递参数(地址) java C# 对于class只能引用传递 结构体定义  type YourName struct 例如: type Vertex struct { X int Y int} ------------------------------------------ package main import "fmt&qu

数据结构-单链表-结构体定义

单链表,用于存储逻辑关系为 "一对一" 的数据,与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的. 结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻. 例如{1,2,3}: 线性表的链式表示又称为非顺序映像或链式映像. 各结点由两个域组成: 数据域:存储元素数值数据 指针域:存储直接后继结点的存储位置 头指针是指向链表中第一个结点的指针 首元结点是指链表中存储第一个数据元素a1的结点 头结点是在链表的首元结点之前