web服务器开发日记之----sendfile零拷贝高效率发送文件

本文详细介绍了sendfile函数的工作原理及其实现方式。相比于传统的文件读写操作,sendfile通过直接在内核间传递数据,避免了多次数据拷贝,提高了传输效率。sendfile函数的应用场景主要是在文件描述符和socket描述符之间进行数据传输。

转自https://blog.csdn.net/hnlyyk/article/details/50856268

#include <sys/sendfile.h>

       ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

其中,in_fd是一个文件描述符,必须指向真实文件,不能使用socket描述符和管道。

out_fd则必须是一个socket描述符。

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

传统的文件传递:

read:

read函数:调用read函数时,文件数据被copy到内核缓冲区

read函数返回:从内核缓冲区拷贝到用户缓冲区。

write:

write函数调用:从用户缓冲区拷贝到套接字缓冲区。

以上程序流程为硬盘→内核buf→用户buf→socket相关缓冲区→协议栈。

转自https://www.cnblogs.com/mthoutai/p/7040007.html

sendfile():

执行流程:调用sendfile系统,文件数据被拷贝到内核缓冲区,再从内核缓冲区拷贝到套接字缓冲区再拷贝到协议栈。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值