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

猜你喜欢

转载自blog.csdn.net/weixin_42634329/article/details/81121458
今日推荐