IT袋

当前位置:主页 > 经验教程 > 系统教程 >

readv和writev函数详解

readv和writev函数详解

时间:2024-01-09 15:59:45 来源:IT袋 作者:马勇
导读:readv和writev函数详解,正文核心介绍:readv和writev函数详解的相关话题,具体详情如下: 在实际开发种,高性能服务有一条尽量减少系统调用的原则。 对于一个文件描述符(file descriptor,fd,例

readv和writev函数详解

正文核心介绍:readv和writev函数详解的相关话题,具体详情如下:

在实际开发种,高性能服务有一条尽量减少系统调用的原则。

对于一个文件描述符(file descriptor,fd,例如文件指针、套接字类型)的 read 或者 write,都是系统调用。

有时候我们会遇到通过一个文件描述对应的文件或套接字上将数据读到多个缓冲区中去,或者将多个缓冲区中的数据同时写入一个文件描述符对应的文件或者套接字中。

readv和writev函数详解

当然,你可以通过多次调用 read 或者 write,挨个操作每个缓冲区。

Linux系统提供了一组readv和writev系列函数来完成上述工作。

这个系列函数的签名如下:

#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);
ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);
ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);

参数 fd 和 offset 的含义都是不言自明的。

参数 iov 是一个 struct iovec 数组,参数 iovcnt 是该数组元素的个数。

函数 readv 和 preadv 调用成功返回总读取字节数,函数 writev 和 pwritev 调用成功返回总写入字节数,函数调用失败均返回 -1。

struct iovec 定义如下:

struct iovec {
    void  *iov_base;    /* Starting address */
    size_t iov_len;     /* Number of bytes to transfer */
};

字段iov_base是存放数据缓冲区的地址,字段iov_len是缓冲区的长度。

我们以 writev 函数为例来演示其用法,假设现在我们需要将 3 段数据同时写入一个 CSV 文件中,第一段数据是 CSV 的文件头信息,第二段和第三段是两只股票信息。

示例代码如下:

char* headerInfo = "timestamp,symbol,side,volume,price\n";
char* firstSymbolInfo = "2014-12-12D06:53:11.127838000,600358,Buy,347,3.48\n";
char* secondSymbolInfo = "2014-12-12D06:53:11.127838000,600359,Buy,251,4.99\n";
struct iovec iov[3];
iov[0].iov_base = headerInfo;
iov[0].iov_len = strlen(headerInfo);
iov[1].iov_base = firstSymbolInfo;
iov[1].iov_len = strlen(firstSymbolInfo);
iov[2].iov_base = secondSymbolInfo;
iov[2].iov_len = strlen(secondSymbolInfo);
//fpCSV 为打开的CSV文件句柄
ssize_t nwritten = writev(fpCSV, iov, 2);

为了提高程序执行效率,读者可能会在很多 C/C++ 网络库中见到 readv 和 writev 函数的身影。

本文分享的readv和writev函数详解的具体介绍,小编希望给网友们带来一些知识。

相关阅读

  • 如何制作win10系统安装光盘 电脑安装光盘修复系统教程

    如何制作win10系统安装光盘 电脑安装光盘修复系统教程

    一篇关于如何制作win10系统安装光盘和电脑安装光盘修复系统教程的相关话题,接下来IT袋带大家一起了解。 我们在网上常见的光盘映像文件格式一般为iso.img两种,而我们通过网站上下载的w

  • win7扩展名怎么修改 win7文件扩展名更改方法

    win7扩展名怎么修改 win7文件扩展名更改方法

    今天带来的IT技巧小经验win7文件扩展名更改方法的电脑小知识,关于win7扩展名怎么修改 win7文件扩展名更改方法,很不错的方法小知识,建议收藏哦! 修改文件扩展名可以改变对应文件的属性

  • 什么是Linux Mint

    什么是Linux Mint

    今天介绍什么是LinuxIT技巧方面的经验,下面小编为您详细解答 Linux Mint是一种免费,开源的操作系统,适用于个人电脑和服务器。 作为Linux发行版之一,它于2006年首次发布,迅速在全球范围内

  • 国产操作系统哪个系统最好 纯国产电脑品牌排行榜

    国产操作系统哪个系统最好 纯国产电脑品牌排行榜

    一篇方法教程,与您分享国产操作系统哪个系统最好和纯国产电脑品牌排行榜的相关知识,下面IT袋为您详细介绍 操作系统,被视为计算机体系的“灵魂”,起着“承上启下”的关键作用。 但