转自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系统,文件数据被拷贝到内核缓冲区,再从内核缓冲区拷贝到套接字缓冲区再拷贝到协议栈。
本文详细介绍了sendfile函数的工作原理及其实现方式。相比于传统的文件读写操作,sendfile通过直接在内核间传递数据,避免了多次数据拷贝,提高了传输效率。sendfile函数的应用场景主要是在文件描述符和socket描述符之间进行数据传输。
1902

被折叠的 条评论
为什么被折叠?



