sendfile函数
sendfile
函数在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,这被称为零拷贝。sendfile
函数的定义如下:
1 |
|
out_fd
参数是待写入内容的文件描述符
in_fd
参数是待读取内容的文件描述符
offset
参数是指从读入文件流的哪个位置开始读,如果为空,则使用读入文件流默认的起始位置
count
参数指定在文件描述符in_fd
和out_fd
之间传输的字节数
sendfile
成功时返回传输的字节数,失败则返回-1并设置errno
。
该函数的man手册明确指出,in_fd
必须是一个支持类似mmap
函数的文件描述符,即它必须指向真实的文件,不能是socket和管道。而out_fd
则必须是一个socket。由此可见,sendfile
几乎是专门为在网络上传输文件而设计的。