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

转自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系统,文件数据被拷贝到内核缓冲区,再从内核缓冲区拷贝到套接字缓冲区再拷贝到协议栈。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值