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