linux高级I/O函数sendfile

linux文件I/O: 高级I/O函数及其代码示例 注: man手册指出,in_fd必须是一个支持类似mmap函数的文件描述符,即它必须指向真实的文件,不能是socket和管道;splice函数可以在两个文件描述符之间移动数据,只在内核空间操作,不需要额外的缓冲区,适用于任意类型的文件描述符之间的数据传输,但至少有一个是管道。sendfile函数可以在两个文件描述符之间直接传输数据,不经过用户空间,减少了数据拷贝和上下文切换的开销,适用于从文件向网络发送数据的场景。readv将数据从文件描述符读到分散的内存块中,即分散读。 阅读详情

sendfile函数,顾名思义,用于传输文件而设计的函数。是linux下的系统调用函数。

函数原型:

#include<sys/sendfile.h>
ssize_t sendfile(int out_fd,int in_fd,off_t* offset,size_t count);

sendfile函数在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,这被称为零拷贝。

函数参数:

  • out_fd参数是代写入内容的文件描述符。
  • in_fd参数是待读出内容的文件描述符。
  • offset参数指定从读入文件流的哪个位置开始读,如果为空,则使用读入文件流默认的起始位置。
  • count参数指定在文件描述符in_fd和out_fd之间传输的字节数。

几点说明:

  • in_fd必须是一个支持类似mmap函数的文件描述符,即它必须指向真实文件,不能是socket和管道。
  • 在Linux2.6.33之前,out_fd必须是一个socket,而从Linux2.6.33之后,out_fd可以是任何文件。这意味着我们不仅可以用该函数在网络上传输文件,还可以使用该函数对本地的文件实现拷贝操作。

返回值:

sendfile成功时返回传输的字节数,失败则返回-1并设置errno。

与read和write系统调用函数的比较:

我们称sendfile函数为零拷贝函数,效率很高。那效率高到底体现在哪里了呢?
比如说客户端想把本地的一个文件通过socket发送给服务器,我们分析一下使用read&write和使用sendfile函数实现的差别:

如果我们使用read和write函数,需要进行如下几个步骤:
1. 调用read函数,文件数据被copy到内核缓冲区
2. read函数返回,文件数据从内核缓冲区copy到用户缓冲区
3. write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区。
4. 数据从socket缓冲区copy到相关协议引擎。

以上细节是传统read/write方式进行网络文件传输的方式,我们可以看到,在这个过程当中,文件数据实际上是经过了四次copy操作:
硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎

而使用sendfile函数,需要进行如下几个步骤:
1. sendfile系统调用,文件数据被copy至内核缓冲区
2. 再从内核缓冲区copy至内核中socket相关的缓冲区
3. 最后再socket相关的缓冲区copy到协议引擎

对比我们可以得出,相比使用sendfile函数,Read & Write方式带来的性能损耗主要有两点:
1. 不必要的内存拷贝。即多了一次从内核缓冲区到用户缓冲区的数据拷贝。
2. 系统调用带来的额外的用户态/内核态上下文切换。我们知道,使用系统调用会发生从内核态到用户态之间的相互转换。使用read&write方式,多使用了一次系统调用,就多了一次上下文切换,降低了性能。

综上我们可以得出,sendfile函数不但能减少切换次数而且还能减少拷贝次数,是一个非常高效的数据拷贝函数,尤其在传输一个非常大的文件时,sendfile函数的高性能体现的更为明显。因此,在以后我们设计到网络传输文件时,应该使用sendfile函数,提高效率。

MFC Windows 程序设计[105]之彩色滚动条(附源码) MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。 阅读详情

相关推荐

别再硬编码了!Flowable工作流动态审批人配置全解析(Spring Boot集成版)

本文深入解析Flowable工作流在Spring Boot中的动态审批人配置技术,通过角色、部门等变量实现审批流程的灵活设计。文章详细介绍了架构原理、前端配置映射、动态候选组解析及查询优化方案,帮助企业提升审批流程的适应性和维护效率。

weixin_30919571的博客 134

Linux 零拷贝sendfile函数

sendfile函数允许在两个文件描述符之间直接传输数据,而无需将数据从内核空间复制到用户空间再发送。它在 Linux 系统上首次出现于 2.2 内核版本。效率很高,这被称为零拷贝。out_fd是输出文件描述符,通常是网络套接字描述符。in_fd是输入文件描述符,通常是打开的文件或套接字。offset是一个指向 off_t 类型的指针,用于指定从输入文件的哪个位置开始传输数据。如果为NULL,则从当前文件偏移量开始传输。count是要传输的字节数。

新法的博客 2202

Cursor AI对话历史丢失?开源工具一键恢复项目聊天记录

在软件开发中,数据持久化与工作区管理是保障开发效率与上下文连续性的基础技术。其核心原理在于通过文件系统路径、数据库存储等机制,将应用状态与用户数据持久化关联。对于依赖AI辅助编程的开发者而言,对话历史是宝贵的项目上下文资产,记录了关键的算法思路、API使用范例和问题解决方案。然而,当开发工具(如基于VS Code的Cursor)采用基于项目绝对路径的工作区隔离机制时,项目路径的变更会导致历史对话看似“丢失”,实则是被隔离在了旧路径对应的数据沙箱中。这直接影响了开发体验与知识沉淀的效率。cursor-chat

weixin_26775679的博客 828

Linux应用开发(14):Linux系统零拷贝技术(sendfile)

在Linux系统中,零拷贝(Zero-Copy)技术是一种高效的数据传输技术,它允许数据直接在发送方和接收方之间传输,无需在内核和用户空间之间复制数据。这种技术可以显著提高文件传输、网络通信等操作的性能。

tecsai的博客 1269

SpyGlass Lint脚本实战:如何用TCL自动化RTL代码检查(附完整配置模板)

本文详细介绍了如何利用TCL脚本实现SpyGlass Lint工具的自动化RTL代码检查。通过构建模块化、工程化的脚本框架,文章提供了从环境搭建、核心配置、规则定制到豁免管理的完整实战指南,并附有可复用的配置模板,旨在帮助IC设计工程师构建高效、一致的代码质量检查流水线。

weixin_29204205的博客 134

HITS算法详解及代码实现

占坑

蓁蓁尔的博客 7461

零拷贝技术----sendfile

零拷贝技术

lkq19941204的博客 842

语言模型推理能力与计算表达力深度解析

语言模型的推理能力本质上是一种知识迁移与泛化应用的过程,其核心在于Transformer架构中的自注意力机制和前馈网络的协同作用。计算表达力作为衡量模型能力的关键指标,涉及函数逼近、组合泛化和上下文理解等多个维度。随着模型规模的扩大,涌现能力现象揭示了参数规模与推理能力之间的非线性关系。在实际应用中,通过提示工程和微调策略可以有效激活和优化模型的推理表现。当前研究正探索模块化架构和世界模型整合等方向,以突破长程推理和因果关系建模等前沿挑战。本文深入探讨了语言模型推理泛化的技术原理与实践方法,为理解计算表达力

weixin_42521032的博客 341

Linux网络编程--sendfile零拷贝高效率发送文件

本博文介绍使用sendfile函数进行零拷贝发送文件,实现高效数据传输,并对其进行验证。 那么什么是sendfile呢? linux系统使用man sendfile,查看sendfile原型如下: #include        ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); Sendfile

志存高远 1万+

华为用自研的MetaERP替换全球顶级的SAP ERP系统,其难度与风险远超一次普通的技术升级,它是一场战略级的、涉及业务筋骨的系统性工程

华为成功用自研MetaERP替换SAP系统,这是一项极具挑战的战略工程。面临四大难度:业务复杂度高(170多国业务)、数据迁移量大(20年历史数据)、技术集成复杂(重构生态系统)、人员适应周期长。同时伴随四大风险:业务中断、数据失真、成本超支、供应链协同问题。华为成功的关键在于:生存压力驱动的战略决心、强大的软件研发能力、以自身业务为试验场、分步实施策略。这一案例证明中国企业能攻克高端软件壁垒,但对大多数企业而言,核心系统替换需谨慎评估风险,建议采用渐进式替代策略。

金牌架构师 535

读懂 SAP S/4HANA 里的 SAP Fiori 架构:前端服务器、搜索链路、传统应用接入与内容组织全景解析

摘要:SAP Fiori架构并非简单的系统连接图,而是明确区分界面层与业务数据层的三层分工体系:用户交互层(浏览器与Fiori launchpad)、前端技术层(SAPUI5运行环境)和业务数据层(SAP S/4HANA后端)。这种分离实现了生命周期解耦,前端专注于统一体验治理,后端处理核心业务逻辑。值得注意的是,SAP Fiori front-end server本质仍是ABAP系统,负责UI技术组件运行。虽然SAP S/4HANA推荐嵌入式部署,但独立部署在多系统场景中仍有价值。典型Fiori应用通过O

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 179

linux sendfile 使用,以及一些坑

sendfile 食用方式 内核态 零拷贝 文件传输&&使用中踩过的坑

github_68341987的博客 1466

基于DNN神经网络的多输入多输出数据回归预测(附带Matlab代码)

假设我们的输入数据包含n个特征,输出数据包含m个特征。在本文中,我们将介绍如何使用DNN(深度神经网络)实现多输入多输出数据回归预测,并提供相应的Matlab代码。需要注意的是,上述代码中的DNN模型是一个简化的示例,您可以根据实际任务的复杂程度和要求进行相应的调整和优化。综上所述,我们介绍了如何使用DNN神经网络实现多输入多输出数据回归预测,并提供了相应的Matlab代码。函数对DNN模型进行训练,其中输入数据需要转置,以适应网络的输入要求。最后,我们使用训练好的模型对测试数据进行预测,并打印预测结果。

DevWizard的博客 1067

Linux 高级I/O函数-sendfile

sendfile函数在两个文件描述符之间直接传递数据(完全在内核中传递),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,又称为zero-copy。 函数原型: #include<sys/sendfile.h> ssize_t sendfile(int out_fd, int in_fd, off_t* offset, size_t count); 其中in_fd就可以认为是读入的文件操作符,out_fd是连接sock_fd,offset为偏移量,为空则从默认的其实位..

站在树顶端设计的男人 385

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux下的网络编程学习(十):高级I/O函数(3):sendfile

sendfile函数   sendfile函数再两个文件描述符之间直接传递数据,由于该传递是在内核中,从而避免了缓冲区和用户缓冲区之间的数据拷贝,效率高。 #include<sys/senfile.h> ssize_t sendfile(int out_id,int in_fd,off_t* offset,size_t cout); in_fd:待读出内容的文件描述符。 out_fd...

weixin_44581722的博客 148

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux中的高级IO函数(二)readv & writev & sendfile & mmap & splice & tee

Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数(比如open和read)那么常用(编写内核模块时一般要实现这些I/O函数),但在特定的条件下却表现出优秀的性能。这些函数大致分为三类:用于创建文件描述符的函数,包括pipe、socketpair、dup/dup2函数。用于读写数据的函数,包括readv/writev、sendfile、mmap/munmap、splice和tee函数。用于控制I/O行为和属性的函数,包括fcntl函数。本节接着介绍第二类。

Lyajpunov的博客 1774

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

《Linux高性能服务器编程》笔记02

第06章 高级I/O函数

阿正的梦工坊 1477

Linux高性能服务器编程学习笔记——高级I/O函数

高级I/O函数高级I/O函数pipe函数dup函数和dup2函数readv和writev函数sendfile函数mmap函数和munmap函数splice函数 高级I/O函数 网络编程常用I/O函数大致分为三类: 用于创建文件描述符的函数,包括pipe、dup/dup2函数。 用于读写数据的函数,包括readv/writev、sendfile等等。 用于控制I/O行为和属性的函数,包括fcntl函数。 pipe函数 #include<unistd.h> int pipe( int fd[2]

weixin_41676930的博客 226

【Linux操作系统系列】高级 I/O 函数

文章目录高级 I/O 函数pipedup 和 dup2readv 和 writevsendfilemmap 和 munmapspliceteefcntl 高级 I/O 函数 pipe #include <unistd.h> // fd[2] 两个 int 函数的数组指针 int pipe(int fd[2]); 创建一个管道,以实现进程间通信 fd[0] 和 fd[1] 分别构成管道的两端,往 fd[1] 写入的数据从 fd[0] 读出(单向) 若要实现双向数据传输,应该使用两个管道 默认情

weixin_54707168的博客 390

Linux高性能服务器编程 | 读书笔记 | 4. 高级 I/O 函数

函数,正如其名字(file control)描述的那样,提供了对文件描述符的各种控制,另一个常见的控制文件描述符属性和行为的系统调用是。最后,文件 B 的内核缓冲区中的数据会根据文件系统的要求和策略适时地被同步到磁盘上,完成文件 B 的更新。系统调用会在内核中建立一个直接从文件 A 的内核缓冲区(磁盘缓存)到文件 B 的内核缓冲区的通道。然后,数据直接从文件 A 的内核缓冲区通过内核内部的机制被传输到文件 B 的内核缓冲区。函数将文件 A 的内容传输到文件 B 时,数据是直接在内核空间中进行转移的。

m0_74795952的博客 1239

与网络相关Linux高级I/O函数

sendfile、 mmap、 splice、tee等Linux高级I/O函数 学习自:https://www.cnblogs.com/kex1n/p/7446291.html

WILLGOSPURS的博客 183

高级I/O函数一(pipe/dup/dup2)

引言 Linux提供了很多高级I/O函数,并不像基础I/O(read,open)那么常用,但是在特定情况下可以表现出更好的性能。 在此讨论和网络编程相关的几个,这些函数大致可以分为三类: 用于创建文件描述符:pipe,dup/dup2等 用于读写数据的函数:readv/writev,sendfile,mmap/munmap,splice,tee 用于I/O行为和属性 :fcntl 一、创建文件...

weixin_38932035的博客 871

Linux高性能服务器编程学习记录——六、高级I/O函数

1、创建文件描述符的函数 pipe函数 #include <unistd.h> int pipe(int fd[2]); 成功返回0,并将一堆打开的文件描述符填入fd[],用fd[0]从管道读,用fd[1]往管道写,不能互换。失败返回-1,并设置errno。 自Linux2.6.11后,管道容量大小默认65536,可以通过fcntl修改。 socketpair函数 #include <sys/types.h> #include <sys/socket.h> int so

judith的博客 332

《Linux高性能服务器编程》学习总结(六)——高级I/O函数

第六章 高级I/O函数   网络I/O一直是Linux网络编程中极其重要的一部分,除了前面讲到的send、recv等,socket编程接口还给出了很多高级了I/O函数,这些函数大致分为三类:用于创建文件描述符的函数、用于读写控制的函数和用于控制I/O行为和属性的函数。   pipe函数是用来创建一个管道,管道是较为原始的进程间通信手段,分为无名管道和有名管道,而无名管道只能...

a5615024的博客 223

linux高性能服务器编程 (六) --高级I/O函数

第六章 高级I/O函数   Linux提供了很多高级的I/O函数,它不是基础的I/O函数(open/read)     1、创建文件描述符的函数比如:pipe、dup/dup2函数     2、读写数据的函数比如:readv/writev、sendfile、mmap/munmap、splice 和 tee 函数     3、控制 I/O 行为和属性的函数比如:fcntl 函数   pip...

weixin_30340353的博客 156

高级I/O函数

Linux提供了很多高级的I/O函数。 他们大致分为三类 用于创建文件描述符的函数,包括pipe,dup/dup2函数。 用于读写数据的函数,包括readv/writev

hahahahusky的博客 140
上一篇: c++11右值引用
下一篇: linux高级I/O函数splice与tee
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值